Sık Yapılan Hatalar: auto Anahtar Sözcüğünü Yanlış Kullanma

auto

C++11'den beri derleyicinin türü otomatik çıkarmasını sağlıyor. Pratik görünse de yanlış kullanılınca ciddi sorunlar çıkıyor. En sık hatalardan bahsedelim.

En tehlikeli hata: auto kullanınca referans & kayboluyor. Veri kopyalanıyor, orijinal değişken değişmiyor.

1std::vector<int> vec = {1, 2, 3};
2
3// YANLIŞ: kopya oluşur
4for (auto x: vec) {
5x = 100; // vec değişmez!
6}
7
8// DOĞRU: referans tutar
9for (auto& x: vec) {
10x = 100; // vec değişir
11}
12
13std::cout << vec[0]; // 100 yazılır

Çıktı: 100

Eğer değişiklik yapmayacaksan const auto& kullan (performans + güvenlik).

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
const auto

yazmazsanız, const nesneyi değiştirilebilir sanıyor derleyici.

1const std::string str = "sabit";
2
3// YANLIŞ: derleyici uyarı verir
4auto s = str; // kopya, const değil
5
6// DOĞRU
7const auto& s = str; // orijinal, const

auto ile auto arasındaki fark kritik. Biri pointer, diğeri kopya.

1int arr[] = {1, 2, 3};
2int* ptr = arr;
3
4// YANLIŞ: kopya pointer
5auto p1 = ptr; // int*
6
7// Konteyner içinde YANLIŞ
8std::vector<int*> ptrs = {&arr[0], &arr[1]};
9for (auto p: ptrs) {
10delete p; // hata! dinamik değil
11}
12
13// DOĞRU: referans pointer
14for (auto* p: ptrs) {
15// p artık int*, güvenli
16}

Bazen auto beklediğiniz türü değil, başka bir türü çıkarıyor.

1std::map<std::string, int> m = {{"a", 1}};
2
3// YANLIŞ: std::pair<const std::string, int> kopya
4auto item = *m.begin();
5
6// DOĞRU: referans tutar
7auto& item = *m.begin();
8item.second = 2; // harita değişir
  • Değiştireceksen: auto&
  • Sadece okuyacaksan: const auto& (en hızlı)
  • Pointer işlemiyorsan: auto veya auto
  • Şüpheleniyorsan:** auto yerine açık tür yaz

bknz: Defer Anahtar Sözcüğü: Kaynakları Güvenli Serbest Bırakma

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • adlı kullanıcıya yanıt verdi
    eskimisfotograf

    haklısın bir kere vector ya da string gibi şeyleri kopyalamaya başlayınca işlemci bayağı uğraşıyor

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    ya özellikle büyük objelerle çalışırken fark çok belli oluyor bir kere kopyalanmamışsa

  • adlı kullanıcıya yanıt verdi
    eskimisfotograf

    evet const auto& kullanmaya başladıktan sonra hız farkını kendim de gördüm özellikle

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    kopya yerine referans kullanınca performans da düşüyor aslında hem veri hem de hız kaybı yaşıyorsun

  • eskimisfotograf

    aslında auto& ile auto arasındaki fark fark ettim referans kaybı gerçekten rahatsız edici