[Opsiyonel]-[Client Src] NULL İşaretçileri nullptr'ye Dönüştürün

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 185

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
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:

C++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
test->TestFunc(NULL); // Burada yukarıdakilerden hangi `TestFunc` fonksiyonunun işleme alınacağı belirsiz.
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:
C++:
Genişlet Daralt Kopyala
test->TestFunc(nullptr);
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;
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.
 
srcdeki tüm null kısımlarınıda nullptr ile değiştirmeyelim mi?
 
srcdeki tüm null kısımlarınıda nullptr ile değiştirmeyelim mi?
Hayır. Tam sayı(int vb.) saklayan bir veri tipini nullptr ile sıfırlamak çok daha fazla anlam karmaşasına neden olabilir.
Aşağıda int veri tipini ele alarak kısa bir özet geçtim.
C++:
Genişlet Daralt Kopyala
int x = 5;
-------------
x = NULL;     // Geçerli kullanım. ancak yine de okunurluk açısından önerilmez.
x = 0;         // En doğru kullanım.
x = nullptr; // 0 dahil "hiç bir şeye" işaret etmiyor anlamına gelir.

nullptr sadece işaretçi türlerini doğrudan destekler.
 
Üst