1. ホーム
  2. winapi

[解決済み] VirtualAllocとHeapAllocの違いは何ですか?

2023-03-22 23:53:41

質問

Windows環境でメモリを確保する方法は、次のようにたくさんあります。 VirtualAlloc , HeapAlloc , malloc , new .

このように、両者の違いは何でしょうか?

どのように解決するのですか?

それぞれのAPIは異なる用途のものです。また、それぞれ、メモリを使い終わったら、正しい deallocation/freeing 関数を使用する必要があります。

VirtualAlloc

低レベルの Windows API で、多くのオプションを提供しますが、主にかなり特殊な状況の人々にとって有用です。より大きなチャンクで (編集: 4KB ではなく) のみメモリを割り当てることができます。これが必要な状況もありますが、そのような状況に陥ったときにはわかるでしょう。最も一般的なのは、他のプロセスと直接メモリを共有しなければならない場合です。汎用的なメモリ割り当てには使わないでください。使用方法 VirtualFree を使って割り当てを解除してください。

ヒープアロック

大きなチャンクではなく、要求された任意のサイズのメモリを割り当てます。 VirtualAlloc . HeapAlloc を呼び出す必要があることを知っています。 VirtualAlloc を呼び出す必要があり、自動的にそうしてくれる。例えば malloc と似ていますが、Windows専用で、さらにいくつかのオプションがあります。一般的なメモリのチャンクを割り当てるのに適しています。WindowsのAPIによっては、渡すメモリの確保にこれを使うことを要求されるかもしれませんし、その仲間である HeapFree を使ってメモリを解放する必要があるかもしれません。

マロク

C言語でメモリを割り当てる方法です。C++ではなくCで書いていて、あなたのコードを例えばUnixコンピュータでも動作させたい場合、あるいは誰かが特にこれを使うように言っている場合は、これを使うことをお勧めします。メモリを初期化しない。 一般的なメモリの塊を割り当てるのに適しています。 HeapAlloc . シンプルなAPI。使用する free を使用して,割り当てを解除します。Visual C++の mallocHeapAlloc .

新しい

C++のメモリ割り当て方法です。C++で書いている場合は、これを使うことをお勧めします。また、割り当てられたメモリにオブジェクトを配置します。使用方法 delete を使って、割り当てを解除します(あるいは delete[] 配列の場合)。Visual Studio の new を呼び出す HeapAlloc を呼び出し、呼び出し方によっては、オブジェクトを初期化します。

最近の C++ 標準 (C++11 以上) では、手動で delete を使用しなければならない場合、そのやり方は間違っているので スマートポインタ のように unique_ptr のようなスマートポインタを使用します。C++14 以降では、同じことが new (などの関数に置き換わる)。 make_unique() ).


他にも似たような関数がいくつかあり SysAllocString のような、特定の状況で使用しなければならないと言われる可能性のある、他の類似の関数もあります。