std::shared_ptr:带有自定义删除器的typedef

4

我正在使用SDL2开发C++应用程序,并想使用shared_ptr来保存指针。所以我做了这样的事情:

typedef std::shared_ptr<SDL_Window> SDLWindowPtr;

我需要在整个程序中使用自定义删除函数,能否在typedef中实现?如果可以,如何实现?删除函数名称为SDL_DestroyWindow。如果不行,如何让shared_ptr使用SDL_DestroyWindow作为自定义删除函数?

提前感谢!


Deleter类型不是std::shared_ptr的一部分。每次创建std::shared_ptr实例时,都应该指定deleter。 - grisha
谢谢。在第一个答案中使用工厂的想法非常好。 - Nidhoegger
2个回答

6

在构造函数中将自定义删除器传递给shared_ptr,因此不能使用typedef(删除器不是实例化的shared_ptr类型的一部分)。

对于unique_ptr,可以实现此功能(其中删除器是类型的一部分)。

我的建议是创建工厂方法来生成SDLWindowPtr(分配适当的删除器)。类似于std::make_shared但专为您的系统设计(例如createSDLWindow?)。


好的,使用typedef不行吗?工厂模式是一个非常好的想法!谢谢! - Nidhoegger
不对,typedef 重新定义了类型,你想要重新定义功能 - 使用函数。 - Hcorg
所以,我将使用工厂。不知道为什么这没想到 :)。感谢 Stack Overflow! - Nidhoegger
在这种情况下,使用工厂的一个大问题是,那些不知道必须使用它的人最终会创建没有正确删除器的指针。我认为这是一个很大的问题。 - Alexis Wilke

1
事实上,你需要在shared_ptr的构造函数中传递删除器,以下是一个示例:
std::shared_ptr<MyObj> ptr(CreateMyObj(), std::ptr_fun(FreeMyObj));

如果您正在使用类,可以调用类的析构函数。另外,您可以创建一个工厂函数来分配SDLWindowPtr的内存,并创建另一个函数来释放它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接