Pergunta

Eu tenho um std::vector<uint8_t> que contém cadeias em deslocamentos específicos. Aqui está um despejo encurtado:

...
@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 ................
...

Eu estou tentando extrair os dados no deslocamento 136 e colocá-lo em um std::string:

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

Este, porém, faz com que meu aplicativo para segfault. Agora eu sou muito novo no desenvolvimento de software sob Linux, mas eu sei como começar meu aplicativo em GDB e obter um registo de chamadas, e acompanhou o problema aqui:

(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

Impressão vec.size() retornos 200 e até mesmo looping sobre o vetor e imprimir os dados me não causa problemas (exatamente acima do trecho de bater!).

Estou compilando em Debian com g ++ 4.3.4. Os ponteiros em que este problema poderia ser?

Foi útil?

Solução

Não é provável um livre em algum lugar incompatíveis / delete mais em seu código que está atrasando o sintoma até agora. Quando você usa memória liberada, o sistema operacional é livre para continuar enquanto lhe aprouver.

Tente executar o programa em valgrind. valgrind usa seu próprio malloc e livre para que ele possa alertá-lo sobre notícias e exclusões incorreta. Certifique-se de compilar sem otimizações e com -g 1 :

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

Certifique-se que você não crie um ponteiro de uma variável de pilha que sai do escopo. Por exemplo, este é um erro comum entre os desenvolvedores mais recentes:

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

Como tem ido fora do escopo, você está retornando um ponteiro para memória liberada.


1 Sobre -g, a partir da página de manual: Produzir informações de depuração no formato nativo do sistema operacional (facadas, COFF, XCOFF, ou ANÃO 2). GDB pode trabalhar com essas informações de depuração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top