2013-03-16 65 views
2

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

例如:

MinHeap h(data); // on stack 

Vs的

MinHeap *h = new MinHeap(); 

此之前从未上来,因为我总是分配内存在堆上一个大对象。

+0

最明显的问题是,为什么你会想“直接删除”堆栈上的东西,它什么时候会自动清理你吗? – john 2013-03-16 20:42:25

+0

那么我真的不会但我的合作伙伴谁更在Java爪牙想避免指针并初始化堆栈上的对象。然后当我们需要明确地删除它时,这个问题就出现了,所以我只是想知道答案,因为这从来没有超过我的想法 – Fox 2013-03-16 20:48:25

+1

好吧,告诉他这是一件好事,并且不会造成任何问题。你不需要删除任何东西。事实上,如果您不需要明确控制对象的生命周期,则在堆栈中执行操作是首选方法。 – john 2013-03-16 20:50:42

回答

3

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

没有,这是不可能的。

据对delete表达式C++ 11标准第5.3.5/2:

如果操作数具有类类型,操作数被转换为指针类型通过调用上文前面提到的 转换函数,并且转换后的操作数用于替代本节中其余部分的原始操作数 。 在第一种替代方法(删除对象)中,删除操作数的值可以是空指针 值,指向由前一个新表达式创建的非数组对象的指针或指向子对象的指针(1.8)表示这样的对象的基类(第10章)的 。如果不是,则行为未定义。 [...]

相关的还有段落3.7.3/3关于与自动存储持续时间的变量(即,分配的“在栈上”):

如果具有自动存储持续时间的变量具有初始化或带有副作用的析构函数, 在其块结束之前不得销毁,即使看起来 似乎未被使用也不会被淘汰,除非类对象或其复制/移动可按照12.8的规定予以消除。

9

堆栈变量在其当前范围内始终有效。您可以强制执行的范围(从而释放分配的内存)利用各地块的大括号你想有实例有效的:

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

} // h gets freed here 
2

短期和唯一的答案是否定的。

如果一个对象在堆栈上分配,它实际上并不是你分配的,而是编译器为你做的。编译器还负责在函数范围结束时“解除”(或“删除”)对象。

使用delete的唯一原因是将您分配的某些内容取消分配给new