- Mesaj
- 4.018
- Çözümler
- 390
- Beğeni
- 4.131
- Puan
- 1.849
- Ticaret Puanı
- 0
Modern ve güncel dil standartlarıyla daha uyumlu ve kod işlevselliği bakımından daha güvenli olduğu için C++11 ve üstü sürüm kullananların uygulaması gereken bir düzenleme olduğunu düşünüyorum.
NULL, çoğu zaman işaretçi türünde int türünü (0) temsil eder ve diğer veri türleriyle zaman zaman çakışıp yanlış kontrollere sebep olabilir. (Bu durum yaşandığında herhangi bir hata almazsınız, ve hatta farkında bile olmazsınız. Ancak kod olması gerektiği mantıkta çalışmaz.)
nullptr ise; işaretçiyi doğrudan temsil eder.
Örnek senaryo:
Aynı isimde ancak farklı türde iki adet fonksiyonumuz var diyelim:
Ve farklı bir yerden aşağıdaki gibi bir çağrı yaptığımızı varsayalım:
NULL verisi int olarak algılanabileceğinden bir karışıklığa sebebiyet verebilir ve derleyici hangi fonksiyonu çağıracağına karar veremeyebilir.
Dolayısıyla bu senaryoya göre doğru çağrı şekli aşağıdaki gibi olmalıdır:
Bu durumda derleyici, işaretçi bekleyen TestFunc fonksiyonunu işleme alacaktır. Buna bağlı olarak, src kodlarında işaretçilerin NULL olarak, nullptr olarak serbest bırakılması daha doğru ve güvenli bir yaklaşımdır.
Burada aklınıza şu soru gelebilir: "E o zaman tam sayı bekleyen fonksiyonu NULL yapmak istediğimizde nasıl yapacağız?"
Bunun için yapmanız gereken(yukarıdaki senaryoyu da dikkate alarak) NULL göndermek yerine 0 göndermek. Yani: test->TestFunc(0);
Fonksiyonların beklediği argümanları ve tiplerini dikkate almak önemli.
Devam edelim;
Artık client src de SAFE_DELETE ile işaretçileri nullptr olarak sıfırlayabilirsiniz. Aynı işlem SAFE_DELETE çağrılmadan elle de yapılabilir, ancak burada sadece aynı işi daha pratik şekilde yapan SAFE_DELETE fonksiyonu güncellemesini gösterdim.
Ek olarak: bu işlem sadece client src ile sınırlı değildir. Server tarafında da aynı mantığı dikkate almanız gerekir.
NULL, çoğu zaman işaretçi türünde int türünü (0) temsil eder ve diğer veri türleriyle zaman zaman çakışıp yanlış kontrollere sebep olabilir. (Bu durum yaşandığında herhangi bir hata almazsınız, ve hatta farkında bile olmazsınız. Ancak kod olması gerektiği mantıkta çalışmaz.)
nullptr ise; işaretçiyi doğrudan temsil eder.
Örnek senaryo:
Aynı isimde ancak farklı türde iki adet fonksiyonumuz var diyelim:
C++:
void TestFunc(int arg) // tam sayı bekleyen bir fonksiyon.
void TestFunc(int * arg) // işaretçi bekleyen bir fonksiyon.
Ve farklı bir yerden aşağıdaki gibi bir çağrı yaptığımızı varsayalım:
C++:
test->TestFunc(NULL); // Burada yukarıdakilerden hangi `TestFunc` fonksiyonunun işleme alınacağı belirsiz.
Dolayısıyla bu senaryoya göre doğru çağrı şekli aşağıdaki gibi olmalıdır:
C++:
test->TestFunc(nullptr);
Burada aklınıza şu soru gelebilir: "E o zaman tam sayı bekleyen fonksiyonu NULL yapmak istediğimizde nasıl yapacağız?"
Bunun için yapmanız gereken(yukarıdaki senaryoyu da dikkate alarak) NULL göndermek yerine 0 göndermek. Yani: test->TestFunc(0);
Fonksiyonların beklediği argümanları ve tiplerini dikkate almak önemli.
Devam edelim;
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.
Artık client src de SAFE_DELETE ile işaretçileri nullptr olarak sıfırlayabilirsiniz. Aynı işlem SAFE_DELETE çağrılmadan elle de yapılabilir, ancak burada sadece aynı işi daha pratik şekilde yapan SAFE_DELETE fonksiyonu güncellemesini gösterdim.
Ek olarak: bu işlem sadece client src ile sınırlı değildir. Server tarafında da aynı mantığı dikkate almanız gerekir.