0

C ランタイム ライブラリと C++ ランタイム ライブラリがありますか、それとも C ランタイムのみですか (つまり、C++ プログラムは C ランタイムを使用します。おそらく、c++ ランタイム ライブラリもあり、C++ は C と C++ ランの両方を使用します)。時間ライブラリ)

次に、C ランタイムと C++ ランタイムの両方が存在する場合、C++ ヒープ メモリ管理モデルは、CRT で使用される C ヒープ メモリ管理モデルと同じですか (メモリ ブロックのリンク リストを使用します)。

編集:

第三に、C++ プログラムが CRT を使用している場合、そのプログラムには 2 つのヒープがあるということですか? 1 つは CRT で使用され、もう 1 つは C++ ランタイムで使用されますか?

4

4 に答える 4

2

通常、C++ プログラムには個別のランタイムがありますが、そのランタイムは C ランタイムの上に実装されているため、できる限り多くの作業を委譲し、メモリ管理はかなり単純です。C++ が C の上で行わなければならない唯一のことは、例外、デストラクタなどを処理することです。実際のメモリ割り当て自体は、malloc. ただし、標準はこれをまったく保証しておらず、信頼することはできません。

于 2012-12-25T15:51:13.457 に答える
2

Windows のヒープには奇妙な点があります。DLL が C ランタイムで静的にリンクする場合、その DLL は独自のヒープを取得します。したがって、このような DLL が 5 つある場合、プロセスには少なくとも 5 つのヒープがあります。また、malloc() (または削除/新規) を呼び出したのと同じ DLL で free() を呼び出すには、十分に注意する必要があります。

于 2012-12-25T15:51:20.617 に答える
1

同じコンパイラ スイート (GCC や Visual C++ など) について話していると仮定すると、通常は C と C++ のランタイムがあり、C 関数を使用している場合は、C ランタイムも C++ プログラムに使用されます。

通常、C++ ランタイムのメモリ管理は C ランタイムのメモリ管理を利用していますが、これは決して与えられたものではなく、依存すべきではありません。結局のところ、既存の実装に別のインターフェイスを追加できるのであれば、通常、完全なヒープ マネージャーを再実装する意味はあまりありません。

于 2012-12-25T15:46:27.960 に答える
0

CおよびC++は、、、、およびこれらの一部の兄弟などmallocのパブリックインターフェイス以外の「ヒープ」がどのように機能するかを定義していません。各コンパイラ/ライブラリベンダーは独自に作成します(もちろん、コンパイラスイートの一部ではないライブラリを使用できます。たとえば、gcc MingWはMicrosoftライブラリを大部分使用します)。newfreedelete

1つのヒープ、2つのヒープ、3つのヒープ、または1000のヒープがあるかどうかを心配することがあまり意味がないかどうかはわかりません。コードに関連するいずれかからメモリを割り当てることができる限り、実際には実装の詳細です。多くのヒープがあります-そして、それらの数が重要になるケースはほとんどありません-おそらく、各ヒープにあるわずかな管理オーバーヘッドを除いてです。しかし、誰かが実際にヒープの設計に乗り越えていない限り、それは数十バイト程度のオーダーになります。

他の場所で述べたように、C ++コードは同じヒープを使用する場合と使用しない場合があり、または別個のヒープを持つ場合があります。繰り返しますが、コードに違いはありません。それを解放するときは、割り当てたときと同じ方法を使用します。つまり、new何かを割り当てたり、free解放したりするために使用しないでください。これは非常に悪いことです。データが同じヒープからのものであっても、データを追跡するために「隠された」情報が保存されていることに気付くかもしれません。これは、隠されているものとは異なります。つまり、「何が起こっているのかを理解すると、奇妙なクラッシュが発生します!mallocdeletenewmallocmalloc

于 2012-12-25T16:09:34.120 に答える