2010-11-22 28 views
2
&(*_shmItr) == NULL 

bu oldukça soru değil, ancak C++ 'ya yeni geldim.Bu geçersiz & (* _ shmItr) == NULL Burada _shmItr bir Liste yineleyici

GCC 3.1.2'de denetlediğinizde _shmItr == NULL gayet iyi, ancak GCC 4.2.2 olarak bu bir hatadır. Hata hakkında google yaptım. Hakaret ve yeniden referanslamanın sorunu çözeceğini söylüyorlar. ve yaptı. Mutluydum. Ama yineleyici hakkında daha fazla şey öğreniyorum. Bu hatayı geçmekte olabileceğini hissediyorum, ancak geçerli değil ve çalışma zamanı problemi verebilir. bana olan öneri ...

Ben biraz araştırma yaptım ve

_shmItr == _shmItr.end() 

Ayrıca aynı amaca ve daha doğru hizmet ettiği bulunmuştur nedir. Yanılıyorsam lütfen beni düzeltin. Temel olarak _shmItr'in geçersiz bir şey tutup tutmadığını kontrol etmeye çalışıyoruz. herhangi bir işlem yapmadan önce.

Şimdiden teşekkürler. İşte

kod yığın

_shpmtItr = _shpmtList.begin(); 

if(_shpmtItr == NULL) 
{ 
    eaLogMsg << setid("APP_FAILED") 
      << "_shpmtItr is NULL in some::few()" 
      << endl; 

    return APP_FAILURE; 
} 

Bu size senaryo söyleyebilir olduğunu. statik

+0

Yineleyiciler, göstericilerden farklı, daha genel bir kavramdır. Bir yineleyici bir işaretçi olarak uygulanabilir, ancak asla böyle olmaya güvenmemelisiniz. –

cevap

2

list::end nolu listeyi sonuna kadar geçip geçmediğinizi kontrol ediyorsanız kesinlikle kullanın. Bir listedeki her öğeyi geçtikten sonraki öğenin NULL olacağının bir garantisi yok. İşaretçinizin işaret ettiği öğenin geçerli olup olmadığını size söylemez. İşte benim sonuçlar olup olmadığını görmek için kontrol olsaydı ben list::end kullanmayı tercih ediyorum yolu geçerli olup olmadığına:

list<whatever>::iterator item = find(myList.begin(), myList.end(), value); 
if(item != myList.end())... 

Çünkü hiçbir unsur varsa o arama yapmak verdiğim aralığında find döner son öğe .

Bu, &(*something)'u yaptığınızda yaptığınız şey, öğenin adresini, tam olarak geçerli olan koddaki yineleyici noktalarını almasıdır. Geçersiz öğelerin NULL olacağını düşünüyorsanız, o zaman amaçlarınız için çalışır. NULL olup olmadıklarını bilmiyorsanız, bu başka bir hikaye.

Hangi kodu kullanıyorsunuz? Belki de sorunuza daha iyi cevap vermemize yardımcı olabilir.

Düzenleme: listenizi bir işaretçiler listesi olmadıkça

NULL ile kontrol edilmesi ardından kötü olduğunu kodunuzda baktığımızda ve list::begin() kullanmak gördükten ve aslında tavsiye ederim (örneğin shared_ptr olarak nesneler gibi veya işaretçi.) Listenin myList.begin() != myList.end() yerine boş olup olmadığını görmek için list::empty kullanın. Bunun anlamı kristal berraktır ve gelecekte bakımı daha kolay olmalıdır.

İlgili konular