Maksud Anda seperti secara manual harus membebaskan memori, menutup file, hal-hal semacam ini? Jika demikian, saya akan mengatakan minimum dan biasanya kurang dari sebagian besar bahasa lain yang saya gunakan, terutama jika kita menggeneralisasikannya tidak hanya untuk "manajemen memori" tetapi "manajemen sumber daya." Dalam hal itu, saya benar-benar berpikir C ++ memerlukan lebih sedikit manajemen sumber daya manual daripada, katakanlah Java atau C #.
Ini terutama disebabkan oleh destruktor yang secara otomatis menghancurkan sumber daya (memori atau lainnya). Biasanya satu-satunya waktu saya harus membebaskan / menghancurkan sumber daya secara manual dalam C ++ adalah jika saya menerapkan struktur data level-vlow (sesuatu yang kebanyakan orang tidak perlu lakukan) atau menggunakan C API di mana saya hanya menghabiskan sedikit waktu membungkus sumber daya C yang perlu secara manual dibebaskan / dihancurkan / ditutup menjadi pembungkus C ++ yang sesuai dengan RAII.
Tentu saja jika pengguna meminta untuk menutup gambar dalam perangkat lunak pengedit gambar, saya harus menghapus gambar dari koleksi atau sesuatu. Tapi mudah-mudahan itu tidak dianggap sebagai manajemen "memori" atau "sumber daya" yang penting dalam konteks ini, karena itu cukup banyak diperlukan dalam bahasa apa pun jika Anda ingin membebaskan memori yang terkait dengan gambar itu pada waktu itu. Tapi sekali lagi yang harus Anda lakukan adalah menghapus gambar dari koleksi dan penghancur gambar mengurus sisanya.
Sementara itu jika saya bandingkan dengan, katakanlah, Java atau C #, Anda sering menemukan orang harus menutup file secara manual di sana, mencabut soket secara manual, mengatur referensi objek ke nol untuk memungkinkan mereka menjadi sampah yang dikumpulkan, dll. Ada jauh lebih banyak memori manual dan manajemen sumber daya dalam bahasa-bahasa itu jika Anda bertanya kepada saya. Dalam C ++ Anda bahkan sering tidak perlu unlock
mutex secara manual, karena loker mutex akan melakukannya untuk Anda secara otomatis ketika mutex keluar dari ruang lingkup. Misalnya, Anda tidak perlu melakukan hal-hal seperti ini di C ++:
System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
...
}
finally
{
if (file != null)
file.Close();
}
Tidak perlu melakukan hal-hal seperti menutup file secara manual di C ++. Mereka akhirnya menutup diri secara otomatis begitu mereka keluar dari ruang lingkup apakah mereka keluar dari ruang lingkup sebagai akibat atau jalur eksekusi normal atau luar biasa. Hal serupa untuk sumber daya terkait memori seperti std::vector
. Kode seperti di file.Close()
atas akan sering disukai karena, terutama dalam konteks finally
blok, yang menunjukkan sumber daya lokal perlu dibebaskan secara manual ketika seluruh pola pikir sekitar C ++ adalah untuk mengotomatisasi itu.
Dalam hal manajemen memori manual, saya akan mengatakan C membutuhkan maksimum, Java / C # jumlah sedang, dan C ++ minimum di antaranya. Ada banyak alasan untuk sedikit malu menggunakan C ++ karena ini adalah bahasa yang sangat sulit untuk dikuasai, tetapi manajemen memori tidak boleh menjadi salah satunya. Sebaliknya saya benar-benar berpikir itu adalah salah satu bahasa yang paling mudah di luar sana dalam aspek yang satu ini.
Tentu saja C ++ tidak membiarkan Anda mulai mengalokasikan memori secara manual dan memohon operator delete/delete[]
untuk membebaskan memori secara manual. Ini juga memungkinkan Anda menggunakan fungsi C seperti malloc
danfree
. Tapi itu semacam praktik pengkodean gaya kuno yang menurut saya sudah usang jauh sebelum orang-orang memberi penghargaan, karena Stroustrup menganjurkan RAII sebelum dia bahkan menciptakan istilah itu sejak awal. Jadi saya bahkan tidak berpikir itu adil untuk mengatakan "C ++ modern" mengotomatisasi manajemen sumber daya, karena itu seharusnya menjadi tujuan selama ini. Anda tidak bisa mendapatkan keselamatan pengecualian jika tidak. Hanya saja, banyak pengembang yang salah kaprah selama awal 90-an mencoba menggunakan C ++ seperti halnya C dengan objek, seringkali mengabaikan penanganan pengecualian, dan tidak pernah seharusnya digunakan seperti itu. Jika Anda menggunakan C ++ dengan cara yang praktis selalu dimaksudkan untuk digunakan, maka manajemen memori benar-benar otomatis dan umumnya bukan sesuatu yang harus Anda tangani secara manual (atau harus berurusan dengan) sama sekali.