Ya, ada masalah dengan pointer. Sangat mungkin Anda menggunakan salah satu yang tidak diinisialisasi dengan benar, tetapi mungkin juga Anda mengacaukan manajemen memori Anda dengan kebebasan ganda atau semacamnya.
Untuk menghindari pointer yang tidak diinisialisasi sebagai variabel lokal, coba deklarasikannya selambat mungkin, sebaiknya (dan ini tidak selalu memungkinkan) ketika mereka dapat diinisialisasi dengan nilai yang berarti. Yakinkan diri Anda sendiri bahwa mereka akan memiliki nilai sebelum digunakan, dengan memeriksa kodenya. Jika Anda mengalami kesulitan dengan itu, inisialisasi mereka ke konstanta penunjuk nol (biasanya ditulis sebagai NULL
atau0
) dan periksa.
Untuk menghindari pointer yang tidak diinisialisasi sebagai nilai anggota, pastikan mereka diinisialisasi dengan benar di konstruktor, dan ditangani dengan benar di konstruktor salinan dan operator penugasan. Jangan mengandalkan init
fungsi untuk manajemen memori, meskipun Anda bisa untuk inisialisasi lainnya.
Jika kelas Anda tidak memerlukan konstruktor salinan atau operator tugas, Anda dapat mendeklarasikannya sebagai fungsi anggota pribadi dan tidak pernah mendefinisikannya. Itu akan menyebabkan kesalahan kompilator jika mereka digunakan secara eksplisit atau implisit.
Gunakan petunjuk cerdas jika memungkinkan. Keuntungan besar di sini adalah, jika Anda tetap menggunakannya dan menggunakannya secara konsisten, Anda benar-benar dapat menghindari penulisan delete
dan tidak ada yang akan terhapus ganda.
Gunakan string C ++ dan kelas container jika memungkinkan, sebagai ganti string dan array gaya C. Pertimbangkan untuk menggunakan .at(i)
daripada [i]
, karena itu akan memaksa pemeriksaan batas. Lihat apakah compiler atau library Anda dapat disetel untuk memeriksa batasan [i]
, setidaknya dalam mode debug. Kesalahan segmentasi dapat disebabkan oleh buffer overruns yang menulis sampah di atas pointer yang sangat bagus.
Melakukan hal-hal tersebut akan sangat mengurangi kemungkinan kesalahan segmentasi dan masalah memori lainnya. Mereka pasti akan gagal untuk memperbaiki semuanya, dan itulah mengapa Anda harus menggunakan valgrind sekarang dan nanti ketika Anda tidak memiliki masalah, dan valgrind dan gdb ketika Anda melakukannya.
g
dalam konteksCMake
?