混淆使用unique_ptr和自定义删除器

帧缓冲区

我正在尝试将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功能,这对我来说很难。

Angew不再为SO感到骄傲

您可以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);

有关详细信息,请参考合适的文档

要缩短长类型,您确实可以使用类型别名(typedefusing):

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());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用lambda和功能作为unique_ptr的自定义删除器

unique_ptr 的有状态自定义删除器

如何制作unique_ptr和自定义删除器的副本

unique_ptr,自定义删除器和零规则

std :: unique_ptr <T []>和自定义分配器删除器

std :: unique_ptr,自定义删除器和类型更改

使用带有unique_ptr的自定义删除器

使用自定义删除器在地图中存储unique_ptr

使用typedef为std :: unique_ptr指定自定义默认删除器

使用std :: function对象将自定义删除器传递给std :: unique_ptr

std :: unique_ptr使用带有很少参数的自定义删除器

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

将具有自定义删除器的unique_ptr移到shared_ptr

智能指针(unique_ptr)自定义删除器错误C2027和C2338

具有自定义删除器的unique_ptr构造函数被删除

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

如何将自定义删除器与std :: unique_ptr成员一起使用?

使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型

初级 5 版。来自自定义删除器函数的 unique_ptr 构造函数

未调用std :: unique_ptr中的自定义删除器

如何在C ++ 11中返回包含自定义删除器的std :: unique_ptr?

如何为由 unique_ptr 管理的数组编写自定义删除器?

了解采用自定义删除器的unique_ptr的构造函数

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

初始化传递给unique_ptr自定义删除器的函子

当使用“新”来初始化unique_ptr <FILE *,File :: Close>时,自定义删除器负责释放该内存吗?

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

如何安全地重载std :: unique_ptr的自定义删除程序?

带有lambda自定义删除程序的std :: unique_ptr无法编译