Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将可释放对象包装到智能指针中_C++_Templates_Pointers - Fatal编程技术网

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,是的,针对需要特定处理的每种类型的对象。好的。我希望围绕这一点,可以使用一个聪明的模板,或者提供方法,而不必担心这一点。:)