指针的默认析构函数?
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 订单有点挑剔。
* 内置类型 技术上 没有像析构函数这样的成员,但你可以假装它们有任何意图和目的,除了你不能按名称引用它们。
假设我有一个自定义向量 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 订单有点挑剔。
* 内置类型 技术上 没有像析构函数这样的成员,但你可以假装它们有任何意图和目的,除了你不能按名称引用它们。