C++ 指针的默认析构函数?

C++ 指针的默认析构函数?,c++,pointers,destructor,C++,Pointers,Destructor,假设我有一个自定义的vector类,vector类的析构函数定义如下 ~vector(void) { for (uint64_t i = 0; i<len_elem; i++) { //destruct each elem front[i].~T(); } ::operator delete(head); head = nullptr; capacity = 0; } ~向

假设我有一个自定义的vector类,vector类的析构函数定义如下

 ~vector(void) {
        for (uint64_t i = 0; i<len_elem; i++) { //destruct each elem
                front[i].~T();
        }
        ::operator delete(head);
        head = nullptr;
        capacity = 0;
 }
~向量(无效){
对于(uint64_t i=0;iTLDR):您的代码很好。
答案很长:是和否

front[i]。~T()
将“正确调用指针的析构函数*”。但是,指针的“析构函数”根本不起作用。因此,此代码正确地不起作用

如果你想释放指针指向的东西,那完全是另一回事。在这种情况下,最简单的方法是使用
vector
或其他什么,这样这个析构函数将调用
unique\u ptr
的析构函数,这些析构函数将释放内存

值得注意的是,几乎每个顺序容器都会尝试从后到前销毁元素,而不是按照您的方式销毁元素。有些类可能会对构造/销毁顺序有点挑剔

*从技术上讲,内置类型没有析构函数这样的成员,但您可以假装它们具有所有意图和用途,只是您不能按名称引用它们。

TLDR:您的代码很好。 答案很长:是和否

front[i]。~T()
将“正确调用指针的析构函数*”。但是,指针的“析构函数”根本不起作用。因此,此代码正确地不起作用

如果你想释放指针指向的东西,那完全是另一回事。在这种情况下,最简单的方法是使用
vector
或其他什么,这样这个析构函数将调用
unique\u ptr
的析构函数,这些析构函数将释放内存

值得注意的是,几乎每个顺序容器都会尝试从后到前销毁元素,而不是按照您的方式销毁元素。有些类可能会对构造/销毁顺序有点挑剔


*从技术上讲,内置类型没有像析构函数这样的成员,但你可以假装它们有任何意图和用途,只是你不能通过名称引用它们。

一句话:没有。至于这是否“正确”,取决于用例。指针没有析构函数,但你可以通过指针调用对象上的析构函数(使用
delete
操作符)。一句话:否。至于这是否“正确”,这取决于用例。指针没有析构函数,但您可以通过指针调用对象上的析构函数(使用
delete
操作符)。标准的顺序容器没有指定销毁顺序(据我所知),所以任何这样的“挑剔阶级”这将是一个马车类。谢谢你的回答,我很好奇为什么容器最好从后到前销毁元素。你介意分享吗,或者链接可能会有所帮助。@elexonics:销毁顺序应该与构造顺序完全相反,这是一个广为接受的惯例。这个惯例是严格遵守的对于本地对象、静态对象、类成员、原始数组等,C++语言也可以使用容器来遵守该约定。但是, STD::vector < /C>显然不能保证。标准顺序容器不指定销毁顺序(我知道)。,所以任何这样的“挑剔阶级”这将是一个马车类。谢谢你的回答,我很好奇为什么容器最好从后到前销毁元素。你介意分享吗,或者链接可能会有所帮助。@elexonics:销毁顺序应该与构造顺序完全相反,这是一个广为接受的惯例。这个惯例是严格遵守的关于本地对象、静态对象、类成员、原始数组等的Y+C++语言。因此,使用容器也遵守该约定可能是有意义的。但是,<>代码>:ST::vector < /代码>显然不能保证。