C menyediakan keupayaan pengurusan memori yang dinamik, yang membolehkan pemaju memperuntukkan dan memori semasa runtime. Pengurusan ini adalah penting untuk mengawal sumber memori dengan cekap, dan alat utama untuk tujuan ini adalah petunjuk new
, delete
, dan pintar.
new
digunakan untuk memperuntukkan memori secara dinamik dari timbunan. Apabila new
dipanggil, ia mengembalikan penunjuk ke permulaan blok memori yang baru diperuntukkan. Sebagai contoh, int* p = new int;
Memori memori untuk integer dan menyerahkan alamat memori itu kepada p
. Sebaliknya, delete
digunakan untuk memori yang sebelum ini diperuntukkan dengan new
. Penggunaan yang betul adalah delete p;
yang membebaskan memori yang ditunjuk oleh p
.Pointers Pintar : Pointer Pintar adalah templat kelas yang direka untuk membantu menguruskan seumur hidup objek yang diperuntukkan secara dinamik. Mereka mengautomasikan proses deallocation memori, mengurangkan risiko kebocoran memori. Terdapat beberapa jenis petunjuk pintar di C:
std::unique_ptr
: Memiliki dan menguruskan objek lain melalui penunjuk dan melupuskan objek itu apabila unique_ptr
keluar dari skop. Ia tidak boleh disalin tetapi boleh dipindahkan.std::shared_ptr
: Mengekalkan pemilikan bersama objek melalui kiraan rujukan. Objek itu dimusnahkan dan ingatannya ditangani apabila shared_ptr terakhir menunjuknya dimusnahkan atau ditetapkan semula.std::weak_ptr
: Rujukan lemah kepada objek yang diuruskan oleh std::shared_ptr
. Ia membolehkan anda mengakses objek yang diuruskan tanpa mengambil pemilikan, dan ia boleh digunakan untuk memecahkan kebergantungan bulat shared_ptr
. Perbezaan utama antara menggunakan penunjuk pintar new
dan delete
dalam C ialah tahap automasi dalam pengurusan memori.
new
dan delete
: Apabila menggunakan new
dan delete
, pengaturcara mesti menguruskan peruntukan dan ingatan secara manual. Ini boleh menyebabkan kebocoran memori jika pengaturcara lupa untuk memanggil delete
atau jika pengecualian berlaku sebelum memori dapat dibebaskan. Ia juga memerlukan pengendalian penunjuk yang teliti untuk mengelakkan penghapusan dua kali atau mengakses memori deallocated (penunjuk menggantung).std::shared_ptr
) dan keupayaan untuk memindahkan pemilikan ( std::unique_ptr
).Pointer pintar memainkan peranan penting dalam mencegah kebocoran memori dalam C dengan mengautomasikan proses deallocation memori. Inilah cara mereka membantu:
delete
pada objek yang mereka maksudkan apabila mereka keluar dari skop. Ini memastikan ingatan sentiasa dibebaskan, walaupun pengecualian dilemparkan.std::shared_ptr
, penunjuk pintar berganda boleh berkongsi pemilikan objek. Objek hanya dihapuskan apabila shared_ptr
terakhir menunjuk ke arahnya dimusnahkan, menghalang penghapusan pramatang dan memastikan semua rujukan diambil kira.std::unique_ptr
Memastikan bahawa apabila penunjuk dimusnahkan, ingatan juga dibebaskan, menghalang penunjuk menggantung. Di samping itu, petunjuk pintar menghalang mengakses memori yang telah ditangani oleh bahagian lain program.std::weak_ptr
boleh digunakan bersamaan dengan std::shared_ptr
untuk memecahkan rujukan bulat, memastikan objek yang terlibat dalam rujukan tersebut masih boleh dimusnahkan dengan baik dan ingatan mereka dibebaskan.Untuk menguruskan memori dengan cekap di C, pertimbangkan amalan terbaik berikut:
std::unique_ptr
untuk pemilikan eksklusif dan std::shared_ptr
untuk senario pemilikan bersama.std::make_shared
dan std::make_unique
: Fungsi ini lebih cekap daripada secara langsung menggunakan new
dengan shared_ptr
atau unique_ptr
kerana mereka dapat mengoptimumkan proses peruntukan.std::shared_ptr
. Gunakan std::weak_ptr
untuk memecahkan kitaran tersebut dan pastikan deallocation yang betul.Dengan mengikuti amalan ini, anda dapat meningkatkan pengurusan memori di C, menjadikan aplikasi anda lebih mantap dan cekap.
Atas ialah kandungan terperinci Bagaimanakah pengurusan memori C berfungsi, termasuk petunjuk baru, memadam, dan pintar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!