从堆栈中删除对象

时间:2010-09-24 14:25:05

标签: c++ delete-operator

从堆栈中手动删除对象是否是错误/非法的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);
}

有没有办法检查对象是在堆上还是在堆栈上?

6 个答案:

答案 0 :(得分:12)

您只能delete new分配了delete的对象。如果您尝试在指向堆栈上的对象的指针上调用{{1}},则可能会导致程序崩溃。

答案 1 :(得分:4)

是的,delete自动变量(即堆栈中的对象)不好。我想编程中仍然没有“永不”,但我想不出你想要这样做的时间/原因。

你在想什么情景?

编辑:实际上,它不仅不好,而且是非法的:

5.3.5删除

  

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)

使用引用而不是指针。