3

最近、(ここで)ポインタ(または少なくとも配列)は、そのメモリが作成された別のアセンブリでは削除できないことがわかりました。私の知る限り、ポインタはメモリ内の変数であり、値としてメモリ内の別の変数のアドレスを持っています。そのため、ポインタの値(変数のアドレス)を消去して、そのメモリを別のアセンブリから解放できないのはなぜですか?

4

1 に答える 1

3

動的割り当ては、割り当て元と同じヒープに戻す必要があります。各 DLL (および がassemblyDLL に対応していると思われます) は独自のヒープを持つことができるため、それが割り当てられたのと同じ DLL で解放するか、奇妙なこと (未定義の動作 - エラーやクラッシュなど) が必要です。起こります。

したがって、2 つの異なるモジュール (DLL、アセンブリ) が同じヒープを持っていることがわかっていない限り、1 つのモジュールで別のモジュールに割り当てられたものを解放することはできません。

元のヒープに何かを返すという要件は、図書館の本を「間違った」図書館に返すことに少し似ています。図書館員が元の図書館で本を見つけることができない場合、あらゆる種類の混乱を引き起こします。 「新しい」図書館もその本についての知識を持っていません。ライブラリにアクセスするときにこれを行うと想像してみてください... ヒープには、ヒープ内のオブジェクトを「追跡」する内部データ構造が含まれます。いきなり元の場所に戻し始めると、おかしなことが起こります。

于 2013-03-10T15:30:10.667 に答える