2016-08-13 14 views
-3

私はセグメント化されたツリーを作成しようとしていますが、ここで不良メモリアロケーションエラー - セグメントツリー

は、ツリーのノードのための私の構造体である:

struct Node{ 
    int x1, x2; // x coordinates 
    int y1, y2; // y coordinates 
    Node * v1; 
    Node * v2; 
    Node * v3; 
    Node * v4; 
    bool oBo; //check if 1 by 1 
    bool O; 
    bool F; 
    int dimens; 
    Node(int myx1, int myx2, int myy1, int myy2){ 
     this->x1 = myx1; 
     this->x2 = myx2; 
     this->y1 = myy1; 
     this->y2 = myy2; 
     this->dimens = abs(x2 - x1); 
     if (dimens == 1) 
     { 
      this->oBo = true; 
     } 
     else 
      this->oBo = false; 

     this->O = false; 
     this->F = false; 

     this->v1 = NULL; 
     this->v2 = NULL; 
     this->v3 = NULL; 
     this->v4 = NULL; 
    } 
}; 

これは地図

のための私のコンストラクタです
MapTree::MapTree(int iSize) 
{ 
this->size = iSize; 
root = new Node(0, size, 0, size); 
segment(root); 
} 

このセグメント関数を使用してルートのサブセグメントを作成しています。次に、関数はルートのサブノードなどで再帰的に呼び出されます。私は2番目のセグメントに不良メモリ割り当てを取得します。すなわち、dimens = 2のとき、なぜこれが起こっているのか分かりません。値とサイズを変更して修正しようとしましたが、ビジュアルスタジオでは特定のメモリ位置に不良メモリ割り当て以外の明確なエラーはありません。ここ

は、セグメント機能である:

void MapTree::segment(Node * node) 
{ 
while (node->oBo != true) 
{ 
    int dimension = node->dimens; 
    node->v1 = new Node(0, dimension/2, 0 , dimension/2); 
    node->v2 = new Node(dimension/ 2, dimension, 0, dimension/ 2); 
    node->v3 = new Node(0, dimension/2 , dimension/2, dimension); 
    node->v4 = new Node(dimension/2, dimension, dimension/2, dimension); 

    segment(node->v1); 
    segment(node->v2); 
    segment(node->v3); 
    segment(node->v4); 
} 

と最後ではなく、少なくとも木に指定されたサイズは常に2のべき乗であるので、セグメントは常にずつの大きさになってしまうしよう​​としていますone

+0

このような問題を解決する適切なツールは、デバッガを使用することですが、デバッガを使用する前にスタックオーバーフローを尋ねるのではなく、行単位でコードを検査する際に行ったすべての観察を教えてください。 –

+0

TL; DR;おそらく、初期化されていない変数を使用して、いくつかのメモリを割り当てようとしています。 –

答えて

0

私は間違っていたことを理解しましたが、ここで私の質問に正しく言わなかったと思います。しかし、私はエラーを発見したいくつかのデバッグの後、ループは再び同じ位置から、したがって無限のメモリ割り当てから再び呼び出されていた。 root node-> oBoは決して真ではないので、無限ループと悪いメモリアロケーションが発生します。