2012-02-24 8 views
2

ポインターが指し示すオブジェクトが解放されないようにするのに問題があります。私はこれが問題だと思うが、私はそれを解決する方法を知らない。ポインターが何も指し示されないようにする

マイコード:

enum TOKEN_TYPE { 
    OPEN, CLOSE, TEXT 
}; 

struct Token { 
    int type; 
    std::string value; 
}; 

typedef std::vector<Token>::iterator token_it; 

Tree::Tree(token_it start) {  
    root.value = start->value; 
    createNode(++start, &root); 
} 

void Tree::createNode(token_it it, Node* parent) { 
    Node current; 

    current.value = it->value; 
    current.parent = parent; 

    if(parent != 0) { 
     parent->children.push_back(&current); 
    } 

    ++it; 
    while(it->type != TOKEN_TYPE::CLOSE && it->value != current.value) { 
     if(it->type == TOKEN_TYPE::OPEN) { 
      createNode(it, &current); 
     } 

     ++it; 
    } 
} 

は私のプログラムは、ガベージコレクションがparentが何を指しているの葉current解放createNode通話を終了するには始まる最後まですべての完璧なプログラムをステップ実行してみました。少なくともそれは私が起こっていると思います。

+0

C++は、デフォルトでは何のガベージコレクタを持っていません。コードは確かにあなたが思うように起こっていません。コードに何が間違っているかを人々に見てもらいたい場合は、コンパイルするものを提供する必要がありますので、自分で試してみることができます。 –

+6

訂正:明示的にそうしない限り、_explicitly allocated_は何も削除されません。ここでの問題は、 'current'がスタック上にあり、スコープから外れると破壊されることです。 – Chowlett

+0

それでは、 'Node'のデストラクタが呼び出されないと、なぜ呼び出されているのですか? (Chowlett ninjaが回答しました) – Lerp

答えて

3

まず、C++ではガベージコレクションはありません。

void Tree::createNode(token_it it, SmartPtr<Node> parent) 

第三に、あなたの仮定が正しいです:

{ 
    Node current; 
    parent->children.push_back(&current); 
} //current is destroyed here 

current自動ストレージに割り当てられているため、この問題が発生した第二

は、代わりに生のポインタのスマートポインタを使用します。あなたはparent内部のメモリを管理する場合

、あなたは動的に現在のノードを作成することができます。

{ 
    Node* current = new Node; 
    parent->children.push_back(current); 
} 
+0

A)ガベージコレクションは、もはや使用されていないメモリの自動解放ではないと思いましたか?範囲外になるオブジェクトを自動的に破棄するときは、何か違うのですか? B) 'new Node'を使うと、Treeのデストラクタ内の全てのノードを削除する必要がありますか? – Lerp

+0

@Rarge:自動オブジェクトは、プログラムの残りの部分が参照を持っているかどうかにかかわらず、スコープから外れると常に破棄されます。ガベージコレクションされたオブジェクトは、使用可能な参照がある限り、生きています。 –

+0

@Rarge B)はい、あなたが私のアドバイスを受けて、生ポインタの代わりにスマートポインタを使用している場合を除きます。 –

関連する問題