2

重複:どのような場合に malloc と new を使用しますか?

この質問を読み直してください:
C++ の "new" と "malloc" と "calloc" の違いは何ですか?

私は答えをチェックしましたが、誰も質問に答えませんでした:

  • new の代わりに malloc を使用するのはいつですか?

理由はいくつかあります(2つ考えられます)。
一番上に浮かび上がらせてください。

4

9 に答える 9

15

心に浮かぶカップル:

  • C++ と C の間でコードを移植できるようにする必要がある場合。
  • C から呼び出される可能性のあるライブラリにメモリを割り当てているときに、C コードが割り当てを解放する必要がある場合。
于 2009-04-30T17:38:29.030 に答える
4

そのスレッドに投稿した Stroustrup FAQ からnew/malloc:

malloc() を使用するときはいつでも、戻りポインターの初期化と適切な型への変換を考慮する必要があります。また、使用するバイト数が正しいかどうかも考慮する必要があります。初期化を考慮すると、malloc() と new の間にパフォーマンスの違いはありません。

これはあなたの質問に答えるはずです。

于 2009-04-30T17:41:49.320 に答える
2

C++ では、ほとんどありません。new は通常、コンストラクターを呼び出す malloc のラッパーです (該当する場合)。

ただし、少なくとも Visual C++ 2005 以降では、malloc を使用すると、実際には new に対するセキュリティの脆弱性が生じる可能性があります。

次のコードを検討してください。

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

それらは同等に見えます。ただし、最初の codegen は実際に整数オーバーフローをチェックしcount * sizeof(MyStruct). ます

于 2009-04-30T17:40:07.827 に答える
2

C++ で malloc を使用する最も良い理由は、純粋な C API と対話する場合です。私が使用した一部の C API は、特定のパラメーターのメモリの所有権を取得します。そのため、それらはメモリを解放する責任があるため、メモリは free を介して解放可能でなければなりません。Malloc はこの目的のために機能しますが、必ずしも新しいものではありません。

于 2009-04-30T17:38:59.890 に答える
2

free() を使用する予定の C ライブラリを使用する場合、誰もが (少し異なる言葉を使用して) 言及しており、それらは周りにたくさんあります。

私が見る他の状況は次のとおりです。

独自のメモリ管理を行う場合 (何らかの理由で、モデリングを通じて発見したデフォルトでは不十分なため)。malloc でメモリ ブロックを割り当て、placement new を使用してプール内のオブジェクトを初期化できます。

于 2009-04-30T17:55:18.883 に答える
1

その理由の 1 つは、C++ では new 演算子をオーバーロードできることです。

コードでシステム ライブラリのメモリ割り当てを確実に使用したい場合は、malloc を使用できます。

于 2009-04-30T17:39:21.103 に答える
0

例外のキャッチについて心配したくない場合 (またはスローしないバージョンの new を使用したい場合) は、malloc を使用できます。

于 2009-04-30T17:42:45.793 に答える
0

C++ プログラマーは、malloc を呼び出す必要があるとしても、ほとんど必要ありません。私が考えることができる唯一の理由は、API の構築が不十分であり、解放を行うため、malloc されたメモリを渡すことを期待していることです。独自のコードでは、new は常に malloc と等しくなければなりません。

于 2009-04-30T17:38:28.970 に答える
0

free() によってメモリが解放される場合 (あなたまたは他の誰かのコードで)、malloc を使用する必要があります。

それ以外の場合はわかりません。不自然なケースの 1 つは、終了時にデストラクタを実行したくない場合ですが、その場合は、とにかく no-op dtor を持つオブジェクトを使用する必要があります。

于 2009-04-30T17:39:30.590 に答える