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