C++ 将可释放对象包装到智能指针中
据我所知,智能指针是用来避免内存泄漏的。但是,通常也有一些对象需要释放,但不是通过C++ 将可释放对象包装到智能指针中,c++,templates,pointers,C++,Templates,Pointers,据我所知,智能指针是用来避免内存泄漏的。但是,通常也有一些对象需要释放,但不是通过免费或删除释放。是否有一些通用的方法将此类指针与模板一起使用 例如,我想到了文件,完成后应该使用fclose。当然还有其他类型的指针,它们有自己独特的释放函数。那么,我是否必须实现单独的包装器来解释它们各自的发布方法,或者是否有更好的方法来做到这一点 可以这样使用的东西: smart_ptr<FILE, fclose> fl = fopen(); smart_ptr<IStream, T->
免费
或删除
释放。是否有一些通用的方法将此类指针与模板一起使用
例如,我想到了文件
,完成后应该使用fclose
。当然还有其他类型的指针,它们有自己独特的释放函数。那么,我是否必须实现单独的包装器来解释它们各自的发布方法,或者是否有更好的方法来做到这一点
可以这样使用的东西:
smart_ptr<FILE, fclose> fl = fopen();
smart_ptr<IStream, T->Release> pFileStream = SHCreateStreamOnFile(...);
smart_ptr fl=fopen();
smart_ptrRelease>pFileStream=SHCreateStreamOnFile(…);
共享的
和独特的
都提供了这一设施
对于
共享\u ptr
,构造函数是一个模板:
可以提供一个可选的deleter d,当没有共享的\u ptr对象拥有该对象时,该deleter d稍后用于销毁该对象。默认情况下,类型Y的删除表达式用作删除器
在这种情况下,deleter可以是任何可调用的、可复制的值,这些值将类型擦除到可调用的
对于unique\u ptr
,删除器的类型是指针本身的类型参数:
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
模板<
T类,
类Deleter=std::default\u delete
>类唯一性\u ptr;
在这种情况下没有擦除,提供给c-tor的删除器或重置实际上与删除器类型匹配。如果您使用的是
唯一\u ptr
或共享\u ptr
,您可以提供自定义删除器。唯一\u ptr
的删除器作为模板参数传递,并且
Deleter必须是FunctionObject或FunctionObject的左值引用或function的左值引用,可使用unique\u ptr::pointer类型的参数调用
对于shated_ptr
,应提供deleter作为构造函数参数
class Foo
{
};
class Deleter
{
public:
void operator()(Foo *)
{
std::cout << "deleter";
}
};
int main() {
std::unique_ptr<Foo, Deleter> ptr(new Foo());
std::shared_ptr<Foo> ptr1(new Foo(),
[](Foo*){std::cout << "deleter for shared_ptr";}
);
}
class-Foo
{
};
类删除器
{
公众:
void运算符()(Foo*)
{
std::cout您可以使用自定义删除器构造共享的ptr
(签名#3)和唯一的ptr
(签名#2)
using T = ...;
auto deleter = [](T* x) { delete x; };
// different deleter - different unique_ptr type
// deleter is stored inline
auto x = std::unique_ptr<T, decltype(deleter)>(new T(...), deleter);
// same shared_ptr<T> type regardless of the deleter type,
// deleter is stored in the "shared state"
auto y = std::shared_ptr<T>(new T(...), deleter);
使用T=。。。;
自动删除器=[](T*x){delete x;};
//不同的删除器-不同的唯一\u ptr类型
//deleter是内联存储的
自动x=std::unique_ptr(新T(…),deleter);
//相同的共享\u ptr类型,而不考虑删除器类型,
//删除程序存储在“共享状态”
自动y=std::shared_ptr(新T(…),deleter);
注意,make_shared()
不能用于构造与自定义删除器共享的文件。是的,标准库中的智能指针接受自定义释放函数。但这仍然意味着我必须为每种类型的对象编写一个单独的删除器,对吗?@Devolus,是的,针对需要特定处理的每种类型的对象。好的。我希望围绕这一点,可以使用一个聪明的模板,或者提供方法,而不必担心这一点。:)