Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Memilih metode alokasi yang tepat
Gunakan panduan berikut untuk memilih API alokasi memori yang sesuai untuk skenario Anda:
| Skenario | API yang direkomendasikan | Notes |
|---|---|---|
| Alokasi C++ tujuan umum | new / std::make_unique / std::make_shared |
Pilihan default untuk kode C++. Menggunakan timbunan CRT secara internal. RAII memastikan pembersihan otomatis. |
| Alokasi C tujuan umum | malloc / calloc / realloc |
Pilihan default untuk kode C. Portabel di seluruh platform. |
| Alokasi lebih besar dari ~1 MB atau membutuhkan kontrol tingkat halaman | VirtualAlloc | Mengalokasikan pada granularitas halaman (biasanya 4 KB). Gunakan untuk menservasi rentang alamat besar, halaman penjaga, atau memori dengan atribut perlindungan tertentu (PAGE_READWRITE, , PAGE_EXECUTE_READdll.). |
| Banyak alokasi kecil dengan kontrol kustom (misalnya, alokator kumpulan) | HeapAlloc / HeapCreate | Buat tumpukan privat untuk kontrol isolasi atau serialisasi. Gunakan HEAP_NO_SERIALIZE hanya jika timbunan secara eksklusif berulir tunggal. |
| Interop COM (memori marshaled) | CoTaskMemAlloc | Diperlukan saat memori melewati batas apartemen COM. Stub yang dihasilkan MIDL menggunakan CoTaskMemAlloc/CoTaskMemFree. |
| Kode warisan menggunakan memori yang dapat dipindahkan | GlobalAlloc / LocalAlloc | Hindari kode baru. Ini menambahkan overhead di atas HeapAlloc dan terutama ada untuk kompatibilitas mundur dengan operasi clipboard dan API Win32 tertentu yang memerlukannya. |
Important
Selalu pasangkan fungsi alokasi dan dealokasi dengan benar. Memori yang dialokasikan dengan HeapAlloc harus dibebaskan dengan HeapFree — bukan free() atau LocalFree. Mencampur keluarga alokasi/dealokasi menyebabkan kerusakan timbunan yang sulit didiagnosis.
Note
VirtualAlloc vs HeapAlloc: VirtualAlloc beroperasi pada granularitas halaman (minimum 4 KB, reservasi yang selaras dengan SYSTEM_INFO.dwAllocationGranularity, biasanya 64 KB). Mengalokasikan banyak objek kecil dengan ruang alamat limbah VirtualAlloc. Gunakan HeapAlloc (atau malloc/new) untuk alokasi kecil dan sering. Gunakan VirtualAlloc saat Anda perlu memesan wilayah alamat besar, mengontrol perlindungan halaman, atau menerapkan alokator kustom.
Perbandingan terperinci
Berikut ini adalah perbandingan singkat dari berbagai metode alokasi memori:
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- baru
- VirtualAlloc
Meskipun fungsi GlobalAlloc, LocalAlloc, dan HeapAlloc pada akhirnya mengalokasikan memori dari tumpukan yang sama, masing-masing menyediakan serangkaian fungsionalitas yang sedikit berbeda. Misalnya, HeapAlloc dapat diinstruksikan untuk menaikkan pengecualian jika memori tidak dapat dialokasikan, kemampuan yang tidak tersedia dengan LocalAlloc. LocalAlloc mendukung alokasi handel yang memungkinkan memori yang mendasar dipindahkan oleh realokasi tanpa mengubah nilai handel, kemampuan yang tidak tersedia dengan HeapAlloc.
Dimulai dengan Windows 32-bit, GlobalAlloc dan LocalAlloc diimplementasikan sebagai fungsi pembungkus yang memanggil HeapAlloc menggunakan handel ke tumpukan default proses. Oleh karena itu, GlobalAlloc dan LocalAlloc memiliki overhead yang lebih besar daripada HeapAlloc.
Karena alokator timbunan yang berbeda menyediakan fungsionalitas yang khas dengan menggunakan mekanisme yang berbeda, Anda harus membebaskan memori dengan fungsi yang benar. Misalnya, memori yang dialokasikan dengan HeapAlloc harus dibebaskan dengan HeapFree dan bukan LocalFree atau GlobalFree. Memori yang dialokasikan dengan GlobalAlloc atau LocalAlloc harus dikueri, divalidasi, dan dirilis dengan fungsi global atau lokal yang sesuai.
Fungsi VirtualAlloc memungkinkan Anda menentukan opsi tambahan untuk alokasi memori. Namun, alokasinya menggunakan granularitas halaman, sehingga menggunakan VirtualAlloc dapat mengakibatkan penggunaan memori yang lebih tinggi.
Fungsi malloc memiliki kerugian karena bergantung pada run-time. Operator baru memiliki kerugian menjadi dependen kompilator dan dependen bahasa.
Fungsi CoTaskMemAlloc memiliki keuntungan bekerja dengan baik di C, C++, atau Visual Basic. Ini juga satu-satunya cara untuk berbagi memori dalam aplikasi berbasis COM, karena MIDL menggunakan CoTaskMemAlloc dan CoTaskMemFree ke memori marshal.
Examples
Topik terkait