我在想:他们说如果你手动调用析构函数--你做错了什么。但情况总是这样吗?有什么反例吗?需要手动调用它,或者很难/不可能/不切实际地避免它的情况?
发布于 2013-01-07 05:35:44
不,你不应该显式调用它,因为它会被调用两次。一次用于手动调用,另一次是在声明对象的范围结束时。
例如:
{
Class c;
c.~Class();
}
如果你真的需要执行同样的操作,你应该有一个单独的方法。
有一个specific situation,您可能想要使用放置new
调用动态分配的对象上的析构函数,但它听起来并不是您所需要的。
发布于 2013-01-07 05:56:37
无论何时需要将分配与初始化分开,您都需要手动放置新的和显式调用析构函数。今天,它很少是必要的,因为我们有标准的容器,但如果你必须实现某种新的容器,你将需要它。
发布于 2013-01-07 05:44:10
在某些情况下,它们是必要的:
在我工作的代码中,我在分配器中使用显式析构函数调用,我实现了一个简单的分配器,它使用新的位置将内存块返回到stl容器。在毁灭中,我有:
void destroy (pointer p) {
// destroy objects by calling their destructor
p->~T();
}
在构造过程中:
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。
https://stackoverflow.com/questions/14187006
复制相似问题