1

コードに 2 つの構造体があります

struct Node
{
int no;
Node* next1;
Node* next2;
char path1;
char path2;
};

struct NodeSet
{
Node* entry;
Node* exit;
};

そしてdequeのような

deque<NodeSet> nsQueue[100]

問題は、実行時:nsQueue[level+1].push_back(ns) 実行前: +

ns  {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=3 next1=0x002999e8 {no=4 next1=0x00299a38 {...} next2=0xcdcdcdcd {...} ...} ...} ...} ...} NodeSet

実行後:+

ns  {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=-858993460 next1=0x00000000 {no=??? next1=??? next2=??? ...} ...} ...} ...}    NodeSet

価値観が変わるのはなぜ?手伝ってくれてありがとう。

4

2 に答える 2

2

Nodeが指しているオブジェクトのリストがns NodeSet何らかの理由で有効ではなくなった (つまり、それらのオブジェクトはもう生きていない) のではないかと思われるため、push_back()呼び出しによってメモリが再利用されています。1 つの手がかりは、呼び出しがpush_back()メモリを破棄したことです。もう 1 つの手がかりは、メモリ ダンプの一部に以下が含まれていることです。

  • と同等のpush_back():の後。このパターンは、初期化された変数の使用を検出するために、MS コンパイラで自動変数 (コードによって明示的に初期化されていない) を初期化するためによく使用されます。no=-858993460no=0xCCCCCCCC

また、 の前にpush_back()、ダンプはそれを示していnext2=0xcdcdcdcdます。このパターンは、デバッグ ヒープ ランタイムによって使用され、「クリーン メモリ」を埋めるために使用されます。これは、メモリが割り当てられているが、割り当て以降にアプリケーションによって書き込まれていないことを示します。これはバグではないかもしれません (別の方法で使用しない限り、割り当てられたメモリに書き込まないことは完全に有効です)、構造体のリスト内のオブジェクトの少なくとも一部Nodeが正しくない可能性があることを示しています。 .

于 2013-05-10T07:14:02.983 に答える