2016-04-09 5 views
0

各ノード(構造体)に名前とキューの文字列フィールドがあるツリーを作成しようとしています<ノード> *フィールドその子ノードを含むキューキューにプッシュするときにランタイムクラッシュが発生する

以下のサンプルコードは、私が大規模で複雑なプログラムで受け取っているエラーを分離する小さなプログラムです。私のエラーとは無関係のものはすべて削除しますが、問題の元のコードに似ています。完全なコードと同じ場所で同じエラーが発生します。これはランタイムクラッシュです。コンパイラはコンパイル時に警告を表示しません。

クラッシュは、ポインターから参照された後に関数に参照渡しされたキューの1つにノードをプッシュしようとすると発生します。

私のコードに数字を含むコメントは、それに続く実行順序を示しています。

#include <string> 
#include <queue> 
#include <iostream> 

using namespace std; 
using std::string; 
using std::queue; 

// the tree node structure 
typedef struct Node 
{ 
    string name; // the name of this node 
    queue<Node>* children; // a queue containing the child nodes 
} Node; 

Node makeNode(string name) 
{ 
    queue<Node> children = {}; // 2, 7, 12 
    Node n = {name, &children}; // 3, 8, 13 
    return n; // 4, 9, 14 
} 

void funcTwo(queue<Node>& nodes) 
{ 
    Node n = makeNode("Child of Child of Root"); // 11 
    cout << "Program prints this." << endl; // 15 
    nodes.push(n); // PROGRAM CRASHES HERE 
    cout << "Program does not print this." << endl; 
} 


void funcOne(queue<Node>& nodes) 
{ 
    Node n = makeNode("Child of Root"); // 6 
    funcTwo(*n.children); // 10 
    nodes.push(n); 
} 

int main() 
{ 
    Node root = makeNode("Root"); // 1 
    funcOne(*root.children); // 5 
    return 0; 
} 

ありがとうございます!

コンパイラ:x86用のMicrosoft(R)C/C++最適化コンパイラバージョン19.00.23506

OS:Windows 7のProfessionalは、あなたのmakeNode機能で

答えて

0

あなたは子供たちにスタック変数を渡しますメンバー。このスタックフレームがポップされると、メモリの割り当てが解除され、ダングリングポインタが残されます。 newまたはstd::make_sharedのいずれかを使用してヒープに割り当てる必要があります。そのため、スタックフレームがポップされたときにメモリの割り当てが解除されません。

関連する問題