Masalahnya sebagian besar adalah artefak bersejarah, bukan ketidakmungkinan implementasi.
Cara kebanyakan kompiler C membuat kode adalah sehingga kompiler hanya melihat setiap file sumber pada satu waktu; tidak pernah melihat keseluruhan program sekaligus. Ketika satu file sumber memanggil fungsi dari file sumber lain atau pustaka, semua kompiler melihat adalah file header dengan jenis fungsi yang dikembalikan, bukan kode sebenarnya dari fungsi tersebut. Ini berarti ketika ada fungsi yang mengembalikan pointer, kompiler tidak memiliki cara untuk mengetahui apakah memori yang menunjuk pointer perlu dibebaskan atau tidak. Informasi untuk memutuskan yang tidak ditampilkan ke kompiler pada saat itu. Seorang programmer manusia, di sisi lain, bebas untuk mencari kode sumber fungsi atau dokumentasi untuk mengetahui apa yang perlu dilakukan dengan pointer.
Jika Anda melihat ke bahasa tingkat rendah yang lebih modern seperti C ++ 11 atau Rust Anda akan menemukan bahwa mereka sebagian besar memecahkan masalah dengan membuat kepemilikan memori eksplisit dalam jenis pointer. Dalam C + + Anda akan menggunakan unique_ptr<T>
alih - alih dataran T*
untuk menahan memori dan unique_ptr<T>
memastikan bahwa memori akan dibebaskan ketika objek mencapai ujung lingkup, tidak seperti dataran T*
. Programmer dapat menyerahkan memori dari satu unique_ptr<T>
ke yang lain, tetapi hanya ada satu unique_ptr<T>
menunjuk pada memori. Jadi, selalu jelas siapa yang memiliki memori dan kapan perlu dibebaskan.
C ++, untuk alasan kompatibilitas ke belakang, masih memungkinkan manajemen memori manual gaya lama dan dengan demikian penciptaan bug atau cara untuk menghindari perlindungan a unique_ptr<T>
. Rust bahkan lebih ketat karena memberlakukan aturan kepemilikan memori melalui kesalahan kompiler.
Adapun keraguan, masalah penghentian dan sejenisnya, ya, jika Anda tetap pada semantik C tidak mungkin untuk memutuskan untuk semua program ketika memori harus dibebaskan. Namun untuk sebagian besar program aktual, bukan latihan akademis atau perangkat lunak kereta, sangat mungkin untuk memutuskan kapan harus bebas dan kapan tidak. Bagaimanapun, itulah satu-satunya alasan mengapa manusia dapat mengetahui kapan harus bebas atau tidak.