重複:どのような場合に malloc と new を使用しますか?
この質問を読み直してください:
C++ の "new" と "malloc" と "calloc" の違いは何ですか?
私は答えをチェックしましたが、誰も質問に答えませんでした:
- new の代わりに malloc を使用するのはいつですか?
理由はいくつかあります(2つ考えられます)。
一番上に浮かび上がらせてください。
重複:どのような場合に malloc と new を使用しますか?
この質問を読み直してください:
C++ の "new" と "malloc" と "calloc" の違いは何ですか?
私は答えをチェックしましたが、誰も質問に答えませんでした:
理由はいくつかあります(2つ考えられます)。
一番上に浮かび上がらせてください。
心に浮かぶカップル:
そのスレッドに投稿した Stroustrup FAQ からnew/malloc
:
malloc() を使用するときはいつでも、戻りポインターの初期化と適切な型への変換を考慮する必要があります。また、使用するバイト数が正しいかどうかも考慮する必要があります。初期化を考慮すると、malloc() と new の間にパフォーマンスの違いはありません。
これはあなたの質問に答えるはずです。
C++ では、ほとんどありません。new は通常、コンストラクターを呼び出す malloc のラッパーです (該当する場合)。
ただし、少なくとも Visual C++ 2005 以降では、malloc を使用すると、実際には new に対するセキュリティの脆弱性が生じる可能性があります。
次のコードを検討してください。
MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));
それらは同等に見えます。ただし、最初の codegen は実際に整数オーバーフローをチェックしcount * sizeof(MyStruct).
ます
C++ で malloc を使用する最も良い理由は、純粋な C API と対話する場合です。私が使用した一部の C API は、特定のパラメーターのメモリの所有権を取得します。そのため、それらはメモリを解放する責任があるため、メモリは free を介して解放可能でなければなりません。Malloc はこの目的のために機能しますが、必ずしも新しいものではありません。
free() を使用する予定の C ライブラリを使用する場合、誰もが (少し異なる言葉を使用して) 言及しており、それらは周りにたくさんあります。
私が見る他の状況は次のとおりです。
独自のメモリ管理を行う場合 (何らかの理由で、モデリングを通じて発見したデフォルトでは不十分なため)。malloc でメモリ ブロックを割り当て、placement new を使用してプール内のオブジェクトを初期化できます。
その理由の 1 つは、C++ では new 演算子をオーバーロードできることです。
コードでシステム ライブラリのメモリ割り当てを確実に使用したい場合は、malloc を使用できます。
例外のキャッチについて心配したくない場合 (またはスローしないバージョンの new を使用したい場合) は、malloc を使用できます。
C++ プログラマーは、malloc を呼び出す必要があるとしても、ほとんど必要ありません。私が考えることができる唯一の理由は、API の構築が不十分であり、解放を行うため、malloc されたメモリを渡すことを期待していることです。独自のコードでは、new は常に malloc と等しくなければなりません。
free() によってメモリが解放される場合 (あなたまたは他の誰かのコードで)、malloc を使用する必要があります。
それ以外の場合はわかりません。不自然なケースの 1 つは、終了時にデストラクタを実行したくない場合ですが、その場合は、とにかく no-op dtor を持つオブジェクトを使用する必要があります。