3

只是想知道,由于我正在与 C++ 项目的合作伙伴合作,是否可以显式删除已在堆栈上初始化的对象?(所以没有指针)

例如:

MinHeap h(data); // on stack

VS

MinHeap *h = new MinHeap();

这从来没有出现过,因为我总是在堆上为一个大对象分配内存。

4

3 回答 3

12

堆栈变量在其当前范围内始终有效。您可以通过在您希望实例有效的块周围使用大括号来强制范围(并因此释放分配的内存):

{
  MinHeap h(data);
  // Do stuff here

} // h gets freed here
于 2013-03-16T20:34:55.300 回答
3

简短而唯一的答案是否定的。

如果在堆栈上分配了一个对象,那么实际上分配它的不是您,而是为您分配的编译器。当函数范围结束时,编译器也有责任“取消分配”(或“删除”)对象。

使用的唯一原因delete是释放分配给new.

于 2013-03-16T20:35:11.453 回答
2

是否可以显式删除已在堆栈上初始化的对象?

,这是不可能的。

根据 C++11 Standard 关于delete表达式的第 5.3.5/2 段:

如果操作数具有类类型,则通过调用上述转换函数将操作数转换为指针类型,并在本节的其余部分使用转换后的操作数代替原始操作数。在第一种选择(删除对象)中,delete 的操作数的值可以是空指针值,指向由先前的 new 表达式创建的非数组对象的指针,或指向表示 a 的子对象 (1.8) 的指针这种对象的基类(第 10 条)。如果不是,则行为未定义。[...]

同样相关的是第 3.7.3/3 段关于具有自动存储持续时间的变量(即“在堆栈上”分配):

如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应在其块结束之前将其销毁,即使看起来未使用也不应作为优化消除,除非是类对象或其复制/移动可以按照 12.8 中的规定消除。

于 2013-03-16T20:38:12.823 回答