4

ここには malloc/free と new/delete の優れた比較があり、malloc() と free() がどのように機能するかについてはここに説明があります。明らかに、それらを混在させてはなりません。free を new で使用するか、delete を malloc で使用してください。

上記の「混合禁止」ルールを尊重しながら、これらのメカニズムの両方を使用して、多くの貢献者がいる多くのオープンソース プロジェクトを見ることができます。通常、1 つのファイルには 1 つの方法しかありません (1 人の作成者、1 つの設定)。私はそのようなプロジェクトをフォークし、新規/削除を使用していくつかの機能を追加しています。しかし、奇妙なメモリ破損に遭遇します。もちろん責任はあると思いますが……。

それは私にいくつかの「素朴な」質問をするように導きます:

  1. 同じコンパイル単位 (*.o) に malloc/free と new/delete の両方のメカニズムを含めることはできますか?

  2. このコードのように、2 つのメカニズムをインターリーブできますか?

    int *a = (int *) malloc (1000 * sizeof int);
    
    int *b = new int[1000];
    
    // some code
    
    free a;
    
    delete[] b;
    
4

1 に答える 1

7

はい、それらをインターリーブできます-割り当てに使用されたものと一致する割り当て解除関数を使用するだけです。この問題は、間違った割り当て解除関数を使用した場合にのみ発生します。

複数のライブラリがある場合、それは簡単ではないことに注意してください-それらは異なるヒープを使用する可能性があるため、正しい名前の関数を使用しても、間違ったモジュールに実装され、間違ったヒープを使用して未定義に陥る可能性があります行動。私がここで話していることのより良いアイデアについては、この回答を参照してください。

于 2013-10-03T09:03:34.103 に答える