从堆栈中手动删除对象是否是错误/非法的C ++,或者有可接受的情况?
编辑
Constructor(pointer parent, pointer left, pointer right):parent_(parent),left_(left), right_(right)
{ }
~Constructor()
{
delete parent_;
delete left_;
delete right_;
}
main()
{
Object parent;
Object left;
Object right;
Constructor c(&parent,&left,&right);
}
有没有办法检查对象是在堆上还是在堆栈上?
答案 0 :(得分:12)
您只能delete
new
分配了delete
的对象。如果您尝试在指向堆栈上的对象的指针上调用{{1}},则可能会导致程序崩溃。
答案 1 :(得分:4)
是的,delete
自动变量(即堆栈中的对象)不好。我想编程中仍然没有“永不”,但我想不出你想要这样做的时间/原因。
你在想什么情景?
编辑:实际上,它不仅不好,而且是非法的:1:delete-expression运算符 破坏最衍生的对象(1.8) 或由new-expression创建的数组。
答案 2 :(得分:1)
有一个角落案例,我可以想到,可以手动删除本地对象。
struct A{
A(){}
int x;
~A(){}
};
int main(){
char buf[sizeof(A)];
A *p = new(buf)A();
p->~A();
}
答案 3 :(得分:0)
通常,您将拥有一个允许编辑堆栈的方法,通常实际堆栈不会暴露给外部世界,以便在类上定义的访问器之外进行操作。所以我说这很糟糕,因为当你手动删除项目时,表示堆栈的对象内部可能会有其他属性和状态变为未同步。
答案 4 :(得分:0)
如果您需要知道所有权已转移,则不要使用原始指针。使用智能指针,例如std :: auto_ptr(Boost和C ++ 0x有更多),这使得所有权的转移显式化,并另外传达如何销毁对象(对于auto_ptr,这意味着删除):
struct Example {
Example(std::auto_ptr<T> parent, std::auto_ptr<TObject> left,
std::auto_ptr<T> right)
: _parent (parent), _left (left), _right (right)
{}
private:
std::auto_ptr<T> _parent, _left, _right;
};
如果你真的坚持,你仍然可以存储原始指针,方法是使用auto_ptr的release方法并为Example(三个规则)编写一个拷贝ctor,析构函数和赋值运算符。
答案 5 :(得分:0)
使用引用而不是指针。