2016-03-23 10 views
1

g ile benim sistemde bu koduHatalı std :: vector erişim çağrıları programdan çıkacak ve yardımcı bir hata mesajı ile derlenebilmesi mümkün mü?

#include <vector> 
#include <iostream> 
main() 
{ 
    std::vector <int> x(1); 
    for(int q=0;; q++) 
    { 
     int y = x[q]; 
     std::cout << q << " "; 
    } 
} 

düşünün ++, bu Segmentation fault (core dumped) ile çarpmadan önce 32570 kadar yazdırır. Muhtemelen bu kadar uzun sürer çünkü ~ 32570, OS ve/veya ayırıcının vektöre tahsis edeceği en küçük bellek yığınıdır. Ama elbette, böyle bir operasyonu yaptığımız zaman, dizinin sonuna kadar, normalde bir hatadır. Bu ne zaman olursa olsun, programın yararlı bir hata mesajı ile çıkabilmesi güzel olurdu.

Xcode ile birkaç yıl önce, std::vector'un türüyle (ve adı?) Çıkacağı yerde gerçekleşen davranışı hatırlıyorum. Şu anda g ++ ile Linux'tayım. Bu hatlar boyunca herhangi bir çözüm var mı (ya da başka bir şey)?

+2

İlgili: [fakat RELEASE içinde DEBUG'da kontrol sınırları yapıyor std :: Vektörün operatör derleme nasıl yapılır] (http://stackoverflow.com/q/1290396/96780) –

+1

Hala bunu biliyorum kodda değişiklikler yapılmasını gerektirir, ancak kapsayıcıların üzerinde yineleme, ve kesinlikle aralık tabanlı-bu programların neden durduğunu araştırmak zorunda kalmadan bu sorunların çoğunu ortadan kaldırır. Bir mesajla çıkmanın, hafızanın üzerine yazılması gibi tanımlanmamış davranışlardan daha iyi olduğunu itiraf ediyorum. – stefaanv

+2

İlgili: [Vektör sınıfının kapsamı dışına çıktığında derleme hatası veya çalışma zamanı hatası yok mu?] (Http://stackoverflow.com/q/27754726/96780). –

cevap

1

Derleme. Ayrıca, __gnu_debug namespace'da bulunan özel hata ayıklama kapsayıcılarını da kullanabilirsiniz. __gnu_debug::vector:

#include <iostream> 
#include <debug/vector> 

int main() 
{ 
    __gnu_debug::vector <int> x(1); 
    for(int q = 0; ; q++) 
    { 
     int y = x[q]; 
     std::cout << q << " "; 
    } 
} 
+1

Hata ayıklama kapsayıcılarının avantajı, belirli kapları ayırabilmeniz ve daha sonra bunları daha sonra std :: kapsayıcıları üzerinde kolayca değiştirebilmenizdir. Yine de bu çıkışı değiştirebilir miyim ya da bir şekilde yorumlayabilir miyim? 'İşlemde yer alan nesneler: dizisi" this "@ 0x0x7ffc2b96e950 {type = NSt7__debug6vectorIiSaIiEEE;}' –

+0

Maalesef libstdC++ source arouund'u kesmeye başlamak istemediğiniz sürece standart hata ayıklama hata iletilerine takıldığını düşünüyorum. Bununla birlikte, şunu da görün: [_GLIBCXX_DEBUG_VERIFY] (https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode_design.html). –

+0

-D_GLIBCXX_DEBUG genellikle destek ile uyumlu olup olmadığını biliyor musunuz? –

2

Dizininizin vektörün aralığını ihlal etmesi durumunda out_of_range istisnasını atan std::vector::at üye işlevini kullanabilirsiniz. enable debug mode in STL containers için -D_GLIBCXX_DEBUG ile

#include <vector> 
#include <iostream> 

int main() { 
    std::vector <int> x(1); 
    for(int q=0;; ++q) { 
    int y = x.at(q); 
    std::cout << q << " "; 
    } 
} 
+0

Yararlı bilgi. Bu, programımda tüm eleman erişim çağrılarını değiştirmemi gerektirse de. Mümkünse hala bir derleyici seçeneğim olmasını isterim. –

İlgili konular