Pregunta

Tengo un std::vector<uint8_t> que contiene cadenas en desplazamientos específicos. Aquí hay un volcado acortado:

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

Estoy tratando de extraer los datos en el desplazamiento 136 y ponerlos en un std::string:

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

Sin embargo, esto hace que mi aplicación se desconecte por defecto. Ahora soy bastante nuevo en el desarrollo de software en Linux, pero sé cómo iniciar mi aplicación en GDB y obtener un seguimiento, y rastreé el problema aquí:

(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

Imprimir vec.size() devuelve 200 e incluso recorrer el vector e imprimir los datos no me causa ningún problema (¡exactamente por encima del fragmento que falla!).

Estoy compilando en Debian con g ++ 4.3.4. ¿Alguna sugerencia sobre cuál podría ser este problema?

¿Fue útil?

Solución

Es probable que haya un error de eliminación / eliminación no coincidente en algún otro lugar de su código que retrase el síntoma hasta ahora. Cuando usa la memoria liberada, el sistema operativo puede continuar siempre que lo considere conveniente.

Intente ejecutar el programa en valgrind. valgrind usa su propio malloc y es gratuito para que pueda alertarlo sobre noticias y eliminaciones incorrectas. Asegúrese de compilar sin optimizaciones y con -g 1 :

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

Asegúrese de no crear un puntero a partir de una variable de pila que se salga del alcance. Por ejemplo, este es un error común entre los desarrolladores más nuevos:

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

Como un fuera de alcance, está devolviendo un puntero a la memoria liberada.


1 Acerca de <=>, desde la página de manual: Produzca información de depuración en el formato nativo del sistema operativo (puñaladas, COFF, XCOFF o DWARF 2). GDB puede trabajar con esta información de depuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top