因为我正在与一个C ++项目的合作伙伴合作,所以只是想知道, 是否可以显式删除已在堆栈上初始化的对象? (所以没有指针)
例如:
MinHeap h(data); // on stack
Vs
MinHeap *h = new MinHeap();
之前从未出现过,因为我总是在堆上为大对象分配内存。
答案 0 :(得分:9)
堆栈变量在其当前范围内始终有效。您可以通过在要使实例有效的块周围使用大括号来强制执行范围(从而释放已分配的内存):
{
MinHeap h(data);
// Do stuff here
} // h gets freed here
答案 1 :(得分:3)
是否可以显式删除已在堆栈上初始化的对象?
否,这是不可能的。
根据关于delete
表达式的C ++ 11标准的第5.3.5 / 2段:
如果操作数具有类类型,则通过调用上述方法将操作数转换为指针类型 转换函数,转换后的操作数用于代替剩余的原始操作数 这个部分。 在第一个替代(删除对象)中,delete的操作数的值可以是空指针 value,指向前一个new-expression创建的非数组对象的指针,或指向子对象的指针(1.8) 表示这种对象的基类(第10条)。如果不是,则行为未定义。 [...]
关于具有自动存储持续时间的变量(即“在堆栈上分配”)的第3.7.3 / 3段也是相关的:
如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应该 在其块结束之前被销毁,即使它看起来也不会作为优化被消除 不使用,但可以按照12.8中的规定消除类对象或其复制/移动。
答案 2 :(得分:2)
简短且唯一的答案是否定的。
如果在堆栈上分配了一个对象,那么实际上并不是你分配它,而是为你编写它的编译器。当函数的范围结束时,它也是负责“取消分配”(或“删除”)对象的编译器。
使用delete
的唯一原因是取消分配您使用new
分配的内容。