- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 unique_ptr
使用 SDL_Surface
的自定义删除器类型。这只是一个使用 int
的示例打字,但我希望你明白了。
#include <iostream>
#include <functional>
#include <memory>
typedef int SDL_Surface;
SDL_Surface * CreateSurface()
{
SDL_Surface * p = new SDL_Surface;
return p;
}
void FreeSurface(SDL_Surface *p)
{
delete p;
}
int main() {
std::unique_ptr<SDL_Surface, std::function< void (SDL_Surface *) > > uptr_1;
//how to assign a value to uptr_1 and the deleter?
return 0;
}
是uptr_1
正确声明并初始化为 nullptr
?如果是这样,我该如何分配指针和删除函数?
我该如何封装它: std::unique_ptr< SDL_Surface, std::function< void (SDL_Surface *) > >
使用删除器并不总是在每个 SDL_Surface
上写那一行我想要另一个 typedef?
我刚开始学习 C++11 的特性,这对我来说很难。
最佳答案
您可以初始化 unique_ptr
使用指针和删除器,或使用 =
通常如果稍后重新分配:
std::unique_ptr<SDL_Surface, std::function<void (SDL_Surface *)>> uptr_1(CreateSurface(), &FreeSurface);
uptr_1 = std::unique_ptr<SDL_Surface, std::function<void (SDL_Surface *)>>(CreateSurface(), &FreeSurface);
引用suitable docs了解详情。
要缩短 long 类型,您确实可以使用类型别名( typedef
或 using
):
typedef std::unique_ptr<SDL_Surface, void (*)(SDL_Surface*)> Surface_ptr;
//or
using Surface_ptr = std::unique_ptr<SDL_Surface, void (*)(SDL_Surface*)>;
注意我实际上使用了 void (*)(SDL_Surface*)
对于删除器类型。如果你知道你总是会传递一个实际的函数(或无状态的 lambda),就没有理由拖入 std::function
,由于类型删除,它有一些开销。
此外,您可以通过为删除器创建一个默认可构造的仿函数来进一步缩短它:
struct FreeSurface_Functor
{
void operator() (SDL_Surface *s) const
{
FreeSurface(s);
}
};
这样,您就可以将指针的类型设置为 std::unique_ptr<SDL_Surface, FreeSurface_Functor>
(可能是别名)并且您不必提供删除程序;它将是默认构造的:
std::unique_ptr<SDL_Surface, FreeSurface_Functor> uptr_1(CreateSurface());
关于c++ - 对使用 unique_ptr 和自定义删除器感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28609454/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!