2

この記事によると、CRT は個別のヒープ (プライベート ヒープですか?) を使用しますが、この小さな例は、CRT ヒープデフォルト ヒープが同じであることを示しています。

HANDLE heaps[64];
DWORD heapCount = GetProcessHeaps(64, heaps);    
for (int i = 0; i<heapCount; i++)
    printf("heap %d : [0x%x]\n", i, heaps[i]);
printf("crt heap[0x%x], default heap[0x%x]\n", _get_heap_handle(), GetProcessHeap());

GetProcessHeap_get_heap_handleが異なるハンドルを返すのはどのような場合ですか?

// VS2012 (プラットフォーム ツールセット v110) でコンパイル

4

4 に答える 4

9

これは VS2012 の新機能で、CRT は既定のプロセス ヒープを使用して割り当てを行うようになりました。以前のバージョンでは、常に独自のヒープが作成されていました。

既定のヒープを使用することの大きな利点は、DLL 内のコードとの相互運用がはるかに簡単になることです。これにより、CRT の独自のコピーがリンクされている DLL を使用しなければならないという問題が大幅に軽減されます。もちろん、コピーも2012年以降のヴィンテージであると仮定します。

潜在的な欠点は、プロセス ヒープが破損したときに意味のある診断を生成したり、正常にシャットダウンしたりすることがより困難になることです。Windows もそのヒープを使用します。また、コード内のメモリ破損は、カーネル呼び出しを含まない種類の OS 呼び出しを不安定にする可能性があり、そこでは何でも可能です。セキュリティ上のリスクも想像できます。安全な CRT の機能強化に慣れてから、この選択がなされたと思います。

于 2013-09-23T17:31:06.977 に答える
1

C ランタイム ソース (malloc.c) は、すべての CRT 割り当てが作成されたことを示しています_crtheap(これが_get_heap_handle返されます)。heapinit.c では、_crtheapに設定されていGetProcessHeapます。_crtheapに設定するsmalheap.c には別の割り当てルーチンがありますHeapCreate

ただし、どの CRT バージョンが smalheap.c を使用し、どの CRT バージョンが heapinit.c を使用するかは明確ではありません (残念ながらプロジェクト ファイルはありません)。

于 2013-09-23T17:21:23.277 に答える
1

FWIW、ハンスの答えに加えて。以下のオプションを使用して、VS2012 CRT にプライベート ヒープを強制的に使用させることができました (残念ながら、リンカーの警告が表示されます)。

  1. C/C++/コード生成/ランタイム ライブラリで /MT に切り替えます (つまり、静的な c ランタイム リンクを使用するため)。
  2. smalheap.objリンカー/入力/追加の依存関係に追加
  3. Linker/Command Line/Additional Options に追加/FORCE:MULTIPLE(_heap_init とその仲間の LNK2005 エラーを回避するため)

私見ですが、プライベート ヒープと c-runtime 動的 dll のオプションがないのは悲しいことです。これは、サード パーティのライブラリでのメモリ リークに役立ちます。プロセスが長時間実行されている場合は、すべてをアンロードして再度ロードすることができます。

于 2016-05-18T08:07:22.607 に答える
0

From the Article, CRT creates its own private heap, which resides on top of the Windows heap.

CRT allocates/de-allocates from the same default process heap. By private it means all the house keeping of objects is private to CRT.

于 2013-09-23T10:23:49.593 に答える