2011-07-07 12 views
5

Boş bir vektör var, bir şey onu bir yere dolduruyor ve bulamıyorum. Bir bellek kesme noktası ayarlamak istiyorum, böylece push_back gerçekleştiğinde program kırılacak.Bir vektör <int> uzunluğunun uzunluğu arttığında nasıl bir kesme noktası belirlerim?

Visual Studio 2008 kullanıyorum ve sorun vektörün dahili üyelerini izleme penceresinde göstermiyor olmasıdır (özel bir biçimlendirmeye sahip gibi görünüyor). Sadece şuna benzer:

myVector [0]() std :: vector < int, std :: allocator < int>>

belirten boyut 0. Herhangi bir ipucu?

+0

Neden push_back'de bir kesme noktası ayarlamıyorsunuz? – JonathonW

+0

Bu kötü değil, yeniden boyutlandırma, atama vb. Gibi diğer durumları yakalayamazdı. Ama teşekkürler! – baddie

+0

Bir vektörün sanal işlevi yoktur ve yalnızca üç üyesi vardır. Biri bir işaretçidir, bir tanesi tahsis büyüklüğüdür ve bir tanesi aslında vektörde bulunan elemanların sayısıdır. Gerçek sınıf düzenini bilmeden (sadece başlığına bakabilirseniz), deneme ve hata ile hangi bellek adresinin izlendiğini bulmak zor olmamalıdır (büyük olasılıkla vec + sizeof (void *) ') – Damon

cevap

5

Bu yanıt VS 2010 içindir - ayrıntılar diğer sürümlerde farklı olabilir.

ayıklayıcı bir std::vector durumunu görüntülemek için bir veri görselleştiricisi kullanır (ya da her ne denir) olduğundan, (ler) sınıfı ve hangisinin gerçek üyelerinin isimlerini belirlemek için <vector> başlığında bakmak zorunda elemanların sayısının izlenmesinden sorumlu olabilir. Bunu yapmanın kolay bir yolu, vector::push_back() numaralı telefona yapılan bir çağrıya adım atmaktır.

VC++ 2010'da bu, _Mylast adında bir üye işaretçisidir.

Yapmanız gereken tek şey, &v._Mylast'a (v hata ayıklama ile ilgilendiğiniz vektör olduğu) yazmalarda bir veri kesme noktası belirlemektir.

Bir sonraki öğeye eklendiğinde, hata ayıklayıcı tam olarak nerede olduğunu gösteren bir çağrı yığını ile kesilir.

0

VC2010'da 0 gösterir, [0] vektörün boyutunu gösterir ve öğeler() içinde görüntülenir. ve bellek adresini bulmak için bellek çıkış pencerelerini kullanabilirsiniz.