Evet, işaretçilerle ilgili bir sorun var. Büyük olasılıkla doğru şekilde başlatılmamış bir tane kullanıyorsunuz, ancak aynı zamanda bellek yönetiminizi çift serbest bırakma veya benzeri bir şeyle karıştırmanız da mümkündür.
Yerel değişkenler olarak başlatılmamış işaretçilerden kaçınmak için, onları olabildiğince geç, tercihen anlamlı bir değerle başlatılabilecekleri zaman (ve bu her zaman mümkün değildir) bildirmeyi deneyin. Kodu inceleyerek, kullanılmadan önce bir değeri olacağına kendinizi ikna edin. Bununla ilgili zorluk yaşıyorsanız, onları boş gösterici sabitine (genellikle NULL
veya olarak yazılır 0
) başlatın ve kontrol edin.
Üye değerler olarak başlatılmamış işaretçilerden kaçınmak için, yapıcıda doğru şekilde başlatıldıklarından ve kopya oluşturucularda ve atama işleçlerinde düzgün şekilde işlendiğinden emin olun. Güvenmeinit
Diğer başlatma işlemleri için yapabilseniz de, bellek yönetimi için işleve .
Sınıfınızın kopya oluşturuculara veya atama işleçlerine ihtiyaç duymuyorsa, bunları özel üye işlevleri olarak ilan edebilir ve asla tanımlayabilirsiniz. Açıkça veya örtük olarak kullanılırsa bu bir derleyici hatasına neden olur.
Mümkün olduğunda akıllı işaretçiler kullanın. Buradaki en büyük avantaj, onlara bağlı kalırsanız ve onları tutarlı bir şekilde kullanırsanız, yazmaktan tamamen kurtulabilirsiniz delete
ve hiçbir şey iki kez silinmez.
Mümkün olduğunda, C tarzı dizeler ve diziler yerine C ++ dizelerini ve kapsayıcı sınıflarını kullanın. Sınır kontrolünü zorlayacağından .at(i)
yerine kullanmayı düşünün [i]
. Derleyicinizin veya kitaplığınızın [i]
, en azından hata ayıklama modunda sınırları denetleyecek şekilde ayarlanıp ayarlanamayacağını görün . Segmentasyon hataları, mükemmel şekilde iyi işaretçilerin üzerine gereksiz yazan arabellek taşmalarından kaynaklanabilir.
Bunları yapmak, bölümleme hataları ve diğer bellek problemleri olasılığını önemli ölçüde azaltacaktır. Şüphesiz her şeyi düzeltmekte başarısız olacaklar ve bu yüzden sorun yaşamadığınızda ara sıra valgrind, yaptığınız zaman da valgrind ve gdb kullanmalısınız.
g
bağlamında derlenmesi ne anlama geliyorCMake
?