指针的默认析构函数?

Default destructor for pointers?

假设我有一个自定义向量 class 并且向量 class 的析构函数定义如下,

 ~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*> myVec,析构函数中的代码会正确执行吗?具体来说,front[i].~T(); 是否会正确调用 vector class 的析构函数?

TLDR:您的代码没问题。

长答案:是和否。

front[i].~T() 将“正确调用指针的析构函数*”。然而,指针的“析构函数”什么都不做。所以这段代码正确地什么都不做。

如果您想 释放 指针指向的东西,那是完全不同的事情。在这种情况下,最简单的做法是改用 vector<std::unique_ptr<int>> 或其他任何方式,以便此析构函数将免费调用 unique_ptr 那些 析构函数的析构函数记忆。

请注意,几乎每个顺序容器都试图从后到前销毁元素,而不是按照您拥有的方式。有些 类 可能对 construction/destruction 订单有点挑剔。

* 内置类型 技术上 没有像析构函数这样的成员,但你可以假装它们有任何意图和目的,除了你不能按名称引用它们。