假设我有一个自定义的向量类,向量类的析构函数定义如下,
~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*> myVec
,析构函数中的代码是否会正确执行?具体来说,front[i].~T();
是否会正确调用向量类的析构函数?
答案 0 :(得分:4)
答案很长:是的,不是。
front[i].~T()
将&#34;正确地调用析构函数以获取指针*&#34;。然而,一个指针&#34;析构函数&#34;什么都不做。所以这段代码正确什么都不做。
如果你想免费指针指向的东西,这是一个完全不同的东西。在这种情况下最简单的方法是使用vector<std::unique_ptr<int>>
或其他任何东西,以便这个析构函数将调用unique_ptr
的析构函数,并且那些析构函数释放内存。
作为一个注释,几乎每个顺序容器都试图从后到前破坏元素而不是你拥有它的方式。有些类可能对构造/销毁顺序有点挑剔。
*内置类型不是技术上有成员像析构函数,但你可以假装它们的目的是为了所有意图和目的,除了你不能通过以下方式引用它们名称