2009-09-14 35 views
6

Tôi có một std::vector<uint8_t> có chứa các chuỗi tại các khoảng bù cụ thể. Dưới đây là một bãi chứa rút ngắn:std :: string :: assign() gây ra segfault

... 
@128 00 00 00 00 00 00 00 00 73 6F 6D 65 74 68 69 33 ........somethin 
@144 38 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ng.............. 
@160 00 00 00 00 00 00 00 00 31 2E 32 2E 33 00 00 00 ........1.2.3... 
@176 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 
... 

Tôi cố gắng để trích xuất các dữ liệu ở bù đắp 136 và đặt nó vào một std::string:

std::string x; 
x.assign(vec.begin()+136, vec.begin()+168); 

này tuy nhiên, nguyên nhân ứng dụng của tôi để segfault. Bây giờ tôi khá mới tại phát triển phần mềm trong Linux, nhưng tôi biết làm thế nào để bắt đầu ứng dụng của tôi trong GDB và nhận được một vết lùi và theo dõi các vấn đề xuống ở đây:

(gdb) backtrace 
#0 0xb7536d78 in ??() from /lib/i686/cmov/libc.so.6 
#1 0xb7538cd5 in malloc() from /lib/i686/cmov/libc.so.6 
#2 0xb7708957 in operator new(unsigned int)() from /usr/lib/libstdc++.so.6 
#3 0xb76e4146 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&)() from /usr/lib/libstdc++.so.6 
#4 0xb76e63b0 in std::string::_M_mutate(unsigned int, unsigned int, unsigned int)() from /usr/lib/libstdc++.so.6 
#5 0xb76e654a in std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int)() from /usr/lib/libstdc++.so.6 
#6 0x0806d651 in std::string::_M_replace_dispatch<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0xbfffe464, __i1=..., __i2=..., __k1=..., __k2=...) at /usr/include/c++/4.3/bits/basic_string.tcc:637 
#7 0x0806d26e in std::string::replace<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:1390 
#8 std::string::assign<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (
    this=0x811c730, vec=...) at /usr/include/c++/4.3/bits/basic_string.h:958 
#9 myclass::somemethod (this=0x811c730, vec=...) at myclass.cpp:135 

In ấn vec.size() trả 200 và thậm chí Looping trên vector và in dữ liệu khiến tôi không gặp vấn đề gì (chính xác ở trên đoạn mã bị lỗi!).

Tôi đang biên dịch bằng Debian với g ++ 4.3.4. Bất kỳ con trỏ nào về vấn đề này có thể là gì?

Trả lời

13

Có khả năng một sự không phù hợp miễn phí/xóa ở một nơi khác trong mã của bạn đang trì hoãn triệu chứng cho đến bây giờ. Khi bạn sử dụng bộ nhớ giải phóng, hệ điều hành sẽ tự do tiếp tục miễn là nó phù hợp.

Thử chạy chương trình bằng valgrind. valgrind sử dụng malloc của riêng mình và miễn phí để nó có thể cảnh báo bạn về các tin tức và xóa không chính xác. Hãy chắc chắn để compile without optimisations và với -g :

g++ -g main.cc -o binary 
valgrind --leak-check=full ./binary 

Hãy chắc chắn rằng bạn không tạo ra một con trỏ từ một biến ngăn xếp mà đi ra khỏi phạm vi. Ví dụ: đây là lỗi thường gặp trong số các nhà phát triển mới hơn:

int *foo() { 
    int a = 0; 
    // do something to a here 
    return &a; 
} 

Như đã hết phạm vi, bạn sẽ trả về con trỏ để giải phóng bộ nhớ.


Về -g, từ manpage: Sản xuất thông tin gỡ lỗi trong định dạng của hệ điều hành bản địa (đâm, COFF, XCOFF, hoặc lùn 2). GDB có thể làm việc với thông tin gỡ lỗi này.

+0

Vì bộ nhớ đã có trong một véc-tơ, tôi nghi ngờ vấn đề đặt ở mới/xóa không khớp. –

+0

Điều buồn cười là, nếu tôi chạy nó thông qua valgrind, không có segfault xảy ra ... –

+0

Không đi quá sâu vào chi tiết cụ thể, tôi đã cố gắng để xóa một cấu trúc addrinfo không tồn tại. tôi đã gọi freeaddrinfo() nhưng không đặt con trỏ thành NULL, điều này khiến tôi thử và xóa cùng một bộ nhớ một lần nữa. –

Các vấn đề liên quan