Apakah memori yang bocor dibebaskan saat program keluar?

117

Jika saya memprogram - tanpa menyadarinya - kebocoran memori, dan aplikasi berhenti, apakah memori yang bocor tersebut dibebaskan?

Martijn Courteaux
sumber
Jawaban terkait yang sangat berguna: unix.stackexchange.com/questions/275184/…
Gabriel Staples

Jawaban:

151

Ya, "kebocoran memori" hanyalah memori yang tidak lagi memiliki referensi untuk proses, dan dengan demikian tidak dapat lagi gratis. OS masih melacak semua memori yang dialokasikan untuk suatu proses, dan akan membebaskannya saat proses itu berakhir.

Dalam sebagian besar kasus, OS akan membebaskan memori - seperti halnya dengan "rasa" normal Windows, Linux, Solaris, dll. Namun penting untuk dicatat bahwa dalam lingkungan khusus seperti berbagai Sistem Operasi Real-Time, memori mungkin tidak dibebaskan saat program dihentikan.

Justin Ethier
sumber
4
Pertanyaan: APAKAH OS melacak semua alokasi? Setiap memori heap yang Anda alokasikan berasal dari ruang memori virtual proses - saat proses berakhir, ruang tersebut dikembalikan ke grosir sistem, bukan? Saya tidak mengerti mengapa pembukuan tambahan diperlukan, karena proses membuat alokasi adalah satu-satunya proses (di userland) dengan akses ke halaman tersebut. Atau apakah saya telah salah diajar?
Chris Tonkinson
6
@Justin: Tanpa mengetahui OS saya rasa ini tidak valid. Mungkin secara eksplisit menentukan OS yang Anda bicarakan.
Brian R. Bondy
1
Catatan: standar tidak mengatakan apa-apa tentang ini. Itu juga tidak dijamin. Ini adalah cara kerjanya pada sebagian besar, jika tidak semua, OS modern tetapi mereka tidak harus dan di masa lalu ada yang sama-sama umum dan tidak melakukan pembersihan ini.
Edward Strange
5
Ada berbagai OS real-time untuk perangkat kecil dan sebagainya yang tidak mengambil kembali memori yang hilang karena kebocoran. Pertanyaan Anda tergantung pada OS yang Anda bicarakan.
Brian Neal
14
Bahkan dengan sistem operasi tertentu yang dilindungi memori, Anda masih perlu mendefinisikan "kebocoran". Sangat mungkin bagi aplikasi untuk mengalokasikan sumber daya "sistem" di luar ruang memorinya (pegangan sering digunakan untuk mengidentifikasinya di dunia Windows). Menutup aplikasi Anda tidak selalu memastikan jenis sumber daya ini dirilis.
David
34

OS yang menjalankan program Anda biasanya melakukan pembersihan memori yang tidak dibebaskan secara eksplisit dan menangani yang tidak ditutup secara eksplisit, tetapi ini tidak dijamin oleh standar C ++. Anda mungkin menemukan beberapa perangkat tertanam yang tidak membebaskan kebocoran memori Anda.

Itu dikatakan Windows dan semua distro Linux yang pernah saya lihat membebaskan kebocoran memori.

Anda dapat dengan mudah membuat putaran besar kebocoran memori untuk mengujinya sendiri. Perhatikan penggunaan RAM Anda tumbuh dan kemudian tutup program Anda. Anda akan melihat bahwa penggunaan RAM kembali turun.


Pertimbangan lain saat menggunakan C ++ adalah jika Anda tidak menghapus memori yang dialokasikan heap, maka destruktor Anda juga tidak dipanggil. Terkadang Anda juga akan mengalami efek samping lain jika penghancur Anda tidak dipanggil.

Brian R. Bondy
sumber
14

Apakah Anda menggunakan OS desktop (Windows, Linux, dll.)? Jika demikian, ya, secara umum sistem akan membebaskan semua memori yang terkait dengan program saat program keluar.

Vicky
sumber
10

Biasanya ya. Beberapa sistem mendukung hal-hal seperti blok memori bersama yang tidak secara otomatis dibebaskan ketika sebuah program keluar. Sebagian besar masih menyimpan jumlah referensi dan menghapusnya ketika semua program yang membukanya keluar, tetapi beberapa tidak (misalnya, Windows 16-bit memiliki beberapa jenis item yang akan tetap dialokasikan bahkan ketika tidak ada yang merujuk padanya - meskipun biasanya macet karena alasan lain sebelum cukup banyak akumulasi ini menyebabkan masalah ...)

Jerry Coffin
sumber
5

Sejauh yang saya tahu, sistem operasi modern akan membebaskan memori ini setelah program dihentikan.

ravibhagw.dll
sumber
4

Tergantung dari memori yang bocor. Beberapa memori tidak dapat diambil kembali oleh OS. Namun, sebagian besar memori di sebagian besar OS akan diambil kembali secara otomatis saat proses keluar.

Anak anjing
sumber
6
Beberapa memori tidak dapat diperoleh kembali oleh OS - seperti apa?
2
Pada beberapa OS real-time, saya telah melihat blok buffer Ethernet khusus yang tidak dibersihkan saat suatu proses keluar.
Brian Neal
1
Memori bersama juga biasanya tidak diperoleh kembali, karena Anda mungkin ingin menyimpannya untuk digunakan proses sementara.
Brian Neal