C++ std::unique_ptr<;何时开始;A>;如果有析构函数,是否需要特殊的删除程序?

C++ std::unique_ptr<;何时开始;A>;如果有析构函数,是否需要特殊的删除程序?,c++,destructor,unique-ptr,delete-operator,C++,Destructor,Unique Ptr,Delete Operator,如果unique\u ptr中的类A是自己的析构函数,是否需要声明一个deleter以确保唯一指针使用该析构函数?我想到的例子是,A有一个mx类型的user\u matrix(我刚刚编的一个名字),它需要调用一个函数free(…)来释放它的内存 ~A(){ user_matrix::free(mx); /*etc*/} 由于default\u deleter将调用delete,我的理解是应该使用~A()。然而,在第5.2节的目录中打开和关闭目录,在JoutTuy(C++标准库:教程和参考书)下

如果
unique\u ptr
中的类
A
是自己的析构函数,是否需要声明一个deleter以确保唯一指针使用该析构函数?我想到的例子是,
A
有一个
mx
类型的
user\u matrix
(我刚刚编的一个名字),它需要调用一个函数
free(…)
来释放它的内存

~A(){ user_matrix::free(mx); /*etc*/}

由于
default\u deleter
将调用
delete
,我的理解是应该使用
~A()
。然而,在第5.2节的目录中打开和关闭目录,在JoutTuy(C++标准库:教程和参考书)下的“相关资源的删除器”下建议一个可能需要声明一个特殊的删除器来做这件事,所以我很困惑…这是因为在给定的示例中,类
DIR
没有使用
closedir(…)
的析构函数吗?

std::unique\u ptr的默认删除器将调用
delete
,而
std::unique\u ptr的默认删除器将调用
delete[]
这些函数将适当地调用对象的析构函数

可能发生的情况是,需要在销毁之前安排一个操作,这可能是因为析构函数不完整(或缺少),也可能是因为您想做更多的事情(例如,一些日志记录)。在这种情况下,您需要一个专用的删除程序来实现这一点

例如,假设给您一个句柄,例如
FILE*
(在C中很常见)。这些句柄通常带有某种类型的
close
方法,并且没有析构函数(因为C中没有析构函数)

struct FileCloser{
void操作符()(文件*f){if(f){fclose(f);}
};
UniqueFile=std::unique\u ptr;

delete
调用
std::unique_ptr
将调用析构函数。请记住:
delete
当您
new
ed时,
delete[]
当您
new[]
ed。对其他类型的资源也要这样做。可能是相关的:一种情况是,您需要一个特殊的删除器,用于为您提供指向某个资源的指针的API,而另一种情况则要求您通过另一个函数调用来释放资源。
struct FileCloser {
    void operator()(FILE* f) { if (f) { fclose(f); } }
};

UniqueFile = std::unique_ptr<FILE, FileCloser>;