13

この質問はインタビューで私に尋ねられました:

C ++では、

  1. mallocを使用してメモリを割り当てdelete、その割り当てられたメモリを解放するために使用するとどうなりますか?
  2. を使用してメモリを割り当て、を使用newして解放するとどうなりfreeますか?

上記のものがコードで使用された場合に直面する問題は何ですか?

私の答えは違いはないということでした。私はそう言ったのは正しかったですか?

4

2 に答える 2

14

そうすると、未定義の動作に遭遇します。絶対に試さないでください。newを介して実装される場合もあれば、を介して実装される場合もmalloc()ありますが、それらが実際にそのよう実装されているという保証はなく、ユーザーは過負荷になり、自分の裁量で実行できます。ヒープの破損に遭遇するリスクがあります。deletefree()newdelete

それ以外は、呼び出すmalloc()と生のメモリが取得され(コンストラクタは呼び出されません)、呼び出すとfree()デストラクタは呼び出されないことを忘れないでください。これは、プログラムの未定義の動作や不適切な機能につながる可能性もあります。

肝心なのは...決してこれをしないでください。

于 2010-07-06T06:59:41.533 に答える
1

1)未定義の動作ですが、おそらく「機能」します。デストラクタは、おそらく分解されたくないメモリが解放されたときに呼び出されます。
2)未定義の動作ですが、おそらく「機能」します。デストラクタは呼び出されません。

つまり、それが機能し、その保証がない場合は、基本的な組み込みデータ型に必要なものとまったく同じように機能する可能性があります。

于 2010-07-06T07:00:10.977 に答える