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で割り当てられたオブジェクトにのみアクセスできますnewdeleteスタック上のオブジェクトを指すポインタを呼び出そうとすると、おそらくプログラムがクラッシュします。

于 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

ローカル オブジェクトを手動で削除しても問題ない、まれなケースが 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

ポインタの代わりに参照を使用してください。

于 2010-09-24T15:44:58.223 に答える
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 メソッドを使用し、例のコピー ctor、デストラクタ、および代入演算子を記述することによって、生のポインタを格納することもできます (3 つの規則)。

于 2010-09-24T14:43:24.827 に答える