2012-10-31 16 views
5

Std haritaları ile garip davranışlar sergilediğim bir projem var.#pragma pack error nedeniyle yolsuzluk hatası - std harita bozulması- çökmesine neden oluyor

Kendi özel haritamızın, özel türün bir işaretçisine eşlenmiş dizeleri tanımladım. Haritaya ilk çifti ekledikten sonra haritayı aştığımda uygulama çöktü.

Çok fazla uğraşmadan sonra haritayı değiştirdim ve uygulamamdaki ilk aramaya taşıdım ve hala çöküyor. Neler olabileceğine dair hiçbir fikrim yok. Herhangi bir yardım takdir edilecektir.

Şu anda kilitlenen kod İşte.

CISInterface Debug [C/C++ Application] 
    gdb/mi (10/31/12 6:02 PM) (Suspended) 
     Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.) 
      6 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const() 0x00000032fd49c416  
      5 std::operator< <char, std::char_traits<char>, std::allocator<char> >() basic_string.h:2317 0x0000000000417ec7 
      4 std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator() stl_function.h:230 0x000000000041706f 
      3 std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_insert_unique() stl_tree.h:1170 0x0000000000415d00  
      2 std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::insert() stl_map.h:500 0x00000000004150eb 
      1 main() CISInterface.cpp:29 0x000000000041916d 
gdb (10/31/12 6:02 PM) 
/home/cillian/workspace/CISInterface/Debug/CISInterface (10/31/12 6:02 PM) 

diğer alanlarda ben sorunlara neden olabileceğini bakıyor olmalıdır Ne - burada

LoggerPtr syslogger(Logger::getLogger("CISInterface")); 

int main(int argc, char *argv[]) 
{ 
    typedef std::map<string, string> MyMapDef; 
    MyMapDef tmpString; 
    tmpString.insert(MyMapDef::value_type("0000", "d")); 
    tmpString.insert(MyMapDef::value_type("1111", "d")); //Crashes here. 
    tmpString.insert(MyMapDef::value_type("2222", "d")); 

// std::string configFile; 
// int c; 
// if(argc < 2) 
// { 
//  //Must have c option 
//  std::cout << "Usage -c configFileName" << std::endl; 
//  exit(EXIT_FAILURE); 
// } 
//Rest of main commented out. 
... 

Ve

yığın izidir. Bağlandığım kütüphanelerde olabilir mi? Aynı kütüphanelerle bağlantı kuran bu kod satırları ile ikinci bir proje oluşturdum (ancak bunlara çağrı yapan herhangi bir kod yok.) Ve çökmez.

+3

Gönderdiğiniz kod gerçekten tüm kod ise, o zaman soruna neden olabilir ** sadece ** şey "LoggerPtr syslogger (Logger :: getLogger (" CISInterface "))' nin neden olduğu yığın bozulmasıdır. "Ana" kod doğrudur. Bu çizgiyi yorumlamayı deneyin ve hala kilitlenme olup olmadığını görün. – john

+1

Sadece 'main() 'nı kopyaladım ve burada çalıştırdım (Ubuntu 12.04, gcc 4.6.3). Şimdiye kadar sorun yok. Hata başka bir yerde olmalı. –

+0

Satır 29 hangisi? –

cevap

3

Sorun çözüldü.

Buraya başka birisinin aynı şeyi yapması ihtimaline karşı ekleyeceğimi düşündüm.

Artan dosyayı bulmaya çalışmak için projemdeki dosyaları yavaşça kaldırdım. Sorunların (bir statik gibi) neden olduğu bir başlık dosyasında tanımlanmış bir şey olması gerektiğini düşünüyordum. Uzun zaman aldı ama sanırım onu ​​buldum. Bir dizi yapıyı tanımlayan bir başlık dosyası vardı. Bunlar tele serileştirildi, böylece 1 byte (#pragma pack (push) kullanarak dosyanın en üstüne koyduğum ve #pragma pack (pop) alt tarafına yerleştirildim. Ama daha sonra ilk #pragma tanımından sonra #include ifadeleri ekledim, bu da dahil edilenlerin yanlış hizalandığını ve bazı nondeterministik davranışlara neden olduğunu gösteriyordu. Bakın herkese teşekkürler. Muhtemelen özniteliği sözdizimini kullanmalı ve sorun olmazdı. Zorbalık kodu tamlık için aşağıdadır.

#pragma pack (push) 
#pragma pack (1) 

#include <string> //Wrong place for includes! 
#include <Units.h> 

typedef struct 
{ 
.... 
} 
#pragma pack (pop) 

Başlangıç ​​sorununa sahip olan herkese teşekkürler.

+1

user1787720, kendi cevabınızı cevap olarak işaretleyin. :) – Yakk

+0

Benzer bir etki, #pragma pack (pop) 'un unutmadan da kaynaklanabilir. –

İlgili konular