2017-11-28 1 views
-3

は、だから私は基本的にこれをしたい:私はこれを行う、そのようにデストラクタを作成するときにSTLコンテナ/スマートポインタを使用して、クラス自身の配列を保持するにはどうすればよいですか?

struct A { 

    A *children[10]; 
}; 

しかし、:

virtual ~A() { 
     for (A *child: children) { 
      delete child; 
     } 
    } 

私は、セグメンテーションフォールトを取得し、私がなぜわかりません。だから、私はSTLクラスを使ってA内のAのリストを保持することができますので、新規/削除について心配する必要はありませんか?私はベクトルを試み、 "不完全な型"のエラーを取得します。 for (A *child: A) { delete child; ...

+0

'std :: vector 'を試しましたか?私は 'A'はそれ自体が含まれているとは思わない?私はここで何かをするのに十分な情報がないので、ここで推測しています。あなたの質問に[mcve]が含まれるように[編集]してください。あなたの例では約20行を超えてはいけません。 – Tas

+0

ここに示すコードでは、ポインタは初期化されていないので、それらの削除はそれぞれ定義されていません。 –

答えて

0

この:

for (shared_ptr<A> child: a.get()->children) { 

childrenを反復しない - それを反復処理しコピーchildren内のポインタの上。したがって、各反復では、(null)共有ポインタ(child)のコピーを作成し、そのループローカルコピーを新しく割り当てられたオブジェクトに設定した後、childが範囲外になり、割り当てられたオブジェクトが解放されます。 children配列内のポインタは変更されません。何をしたい

は次のとおりです。

for (shared_ptr<A> &child: a.get()->children) { 

明示的な参照(&)は、ループの各反復では、childchildren配列のshared_ptrへの参照ではなくコピーであることを意味します。だからそれに割り当てると、配列が変更されます。

+2

質問が完全に変更されたので、あなたの答えは新しい質問に合っています。私は古いものに合っています。私はここで何をすべきでしょうか、変化する編集をロールバックしますか?あきらめる? –

3

ので

  1. あなたはおそらくchildren、ないAを反復処理する必要があります。
  2. 上記の動作をするには、生の配列(std::vector<A> children)ではなく、std::vectorに子供を格納する必要があります。
  3. 生ポインタの代わりにsmart pointerstd::shared_ptrなど)を使用すると、何も削除する必要はありません。
+0

私はstlコンテナを使用する方法を考え出しましたが、初期化の問題が発生しました。更新された質問を参照してください。 – BeardMagician

+5

@BeardMagician質問を全く別のものに変更しないでください。代わりに新しい質問をしてください。 – LukeG

関連する問題