首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >手动调用析构函数总是糟糕设计的标志吗?

手动调用析构函数总是糟糕设计的标志吗?
EN

Stack Overflow用户
提问于 2013-01-07 05:33:21
回答 7查看 112.8K关注 0票数 87

我在想:他们说如果你手动调用析构函数--你做错了什么。但情况总是这样吗?有什么反例吗?需要手动调用它,或者很难/不可能/不切实际地避免它的情况?

EN

回答 7

Stack Overflow用户

发布于 2013-01-07 05:35:44

不,你不应该显式调用它,因为它会被调用两次。一次用于手动调用,另一次是在声明对象的范围结束时。

例如:

代码语言:javascript
复制
{
  Class c;
  c.~Class();
}

如果你真的需要执行同样的操作,你应该有一个单独的方法。

有一个specific situation,您可能想要使用放置new调用动态分配的对象上的析构函数,但它听起来并不是您所需要的。

票数 12
EN

Stack Overflow用户

发布于 2013-01-07 05:56:37

无论何时需要将分配与初始化分开,您都需要手动放置新的和显式调用析构函数。今天,它很少是必要的,因为我们有标准的容器,但如果你必须实现某种新的容器,你将需要它。

票数 6
EN

Stack Overflow用户

发布于 2013-01-07 05:44:10

在某些情况下,它们是必要的:

在我工作的代码中,我在分配器中使用显式析构函数调用,我实现了一个简单的分配器,它使用新的位置将内存块返回到stl容器。在毁灭中,我有:

代码语言:javascript
复制
  void destroy (pointer p) {
    // destroy objects by calling their destructor
    p->~T();
  }

在构造过程中:

代码语言:javascript
复制
  void construct (pointer p, const T& value) {
    // initialize memory with placement new
    #undef new
    ::new((PVOID)p) T(value);
  }

还可以使用特定于平台的alloc和dealloc机制,在allocation ()中进行分配,在allocate()中进行内存释放。这个分配器被用来绕过doug lea malloc,直接使用,例如windows上的LocalAlloc。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14187006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档