Tengo un std::vector<uint8_t>
que contiene cadenas en desplazamientos específicos. He aquí un vertedero acortada:std :: string :: assign() causa 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 ................
...
Estoy tratando de extraer los datos en el desplazamiento 136 y ponerlo en un std::string
:
std::string x;
x.assign(vec.begin()+136, vec.begin()+168);
Esto, sin embargo, hace que mi solicitud a segfault. Ahora estoy bastante nuevo en el desarrollo de software bajo Linux, pero sí sé cómo empezar mi aplicación en el BGF y conseguir una traza, y rastreado el problema aquí abajo:
(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
impresión vec.size()
devuelve 200 e incluso más de un bucle el vector y la impresión de los datos no me causa ningún problema (¡exactamente encima del fragmento que se cuelga!).
Estoy compilando en Debian con g ++ 4.3.4. ¿Alguna sugerencia sobre cuál podría ser este problema?
Dado que la memoria ya está en un vector, dudo que el problema radique en una falta de coincidencia nueva/eliminar. –
Lo curioso es que si lo ejecuto a través de valgrind, no ocurre segfault ... –
Para no profundizar en detalles, estaba intentando eliminar una estructura addrinfo inexistente. llamaba a freeaddrinfo() pero no establecía el puntero a NULL, esto me hizo tratar de borrar la misma memoria de nuevo. –