1

デザイン モードでツリー ノードのデータを表示するように VirtualTreeView を変更しようとしています。

ノードメモリの割り当てはプライベート静的メソッドにあるため、何もできません。次に、新しいサイズに合わせてメモリを再割り当てしようとしています。

テスト目的で、同じ量のメモリを再割り当てしようとしています:

ReallocMemory(Node, sizeof(Node^))

しかし、IDE はランダムな繰り返しでハングアップし、大量の AV がスローされます。メモリ割り当てに関する知識がかなり不足しているため、何かを忘れていると思います。指さしていただけますか?

4

1 に答える 1

7

ReallocMemory関数です。新しいポインタ値を返します。引数は変更されません。ReallocMem代わりに呼び出すか、関数の結果を使用します。

ReallocMem(Node, SizeOf(Node^));

また

Node := ReallocMemory(Node, SizeOf(Node^));

これらの関数のいずれかがメモリのブロックをインプレースでサイズ変更できない場合、新しいメモリを割り当て、古いコンテンツを新しいバッファにコピーしてから、元のバッファを解放します。結果を無視するReallocMemoryと、新しいポインターが破棄され、古い古いポインターがNode変数に保持されます。古いポインタを継続して使用すると、アクセス違反やその他の予測できない動作が説明されます。


C ++互換性のために、これらの関数には2つのバージョンがあります。C ++には、Delphiの「コンパイラマジック」がありません。これにより、コンパイラは、任意のポインタ型ReallocMemを受け入れて変更する単一の関数を持つことができます。

このReallocMemory関数はC++関数のように見えますreallocが、まったく同じように動作するわけではありません。そのため、入力変数を関数の戻り値で直接上書きしても安全です。再割り当てが失敗すると、関数は、のように例外をスローします。ReallocMemここで、reallocはnullポインタを返します。

于 2012-12-21T16:27:30.690 に答える