0

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

有什么方法可以检查对象是在堆上还是在堆栈上?

4

6 回答 6

12

您只允许delete使用已分配的那些对象new。如果您尝试调用delete指向堆栈上对象的指针,您可能会导致程序崩溃。

于 2010-09-24T14:28:11.090 回答
4

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

你在想什么场景?

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

5.3.5 删除

1:delete-expression 操作符销毁由 new-expression 创建的最派生对象 (1.8) 或数组。

于 2010-09-24T14:32:32.097 回答
1

我可以想到一种极端情况,可以手动删除本地对象。

struct A{
    A(){}
    int x;
    ~A(){}
};

int main(){
    char buf[sizeof(A)];
    A *p = new(buf)A();
    p->~A();
}
于 2010-09-24T14:38:22.133 回答
0

通常,您将拥有一个允许您编辑堆栈的方法,并且通常实际堆栈不会暴露给外部世界以在类上定义的访问器之外进行操作。所以我会说这很糟糕,因为当您手动删除项目时,表示堆栈的对象内部可能还有其他属性和状态变得不同步。

于 2010-09-24T14:29:37.063 回答
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、析构函数和赋值运算符(三规则)。

于 2010-09-24T14:43:24.827 回答
0

使用引用而不是指针。

于 2010-09-24T15:44:58.223 回答