2011-09-22 16 views
6

Valgrind se queja de una invocación substrs.¿Cuál es la razón de este error de Valgrind?

string Message::nextField(string& input) { 
    int posSeparator = input.find_first_of(SEPARATOR); 
    string temp; 
    temp = input.substr(0, posSeparator); //Error points to this line 
    input.erase(0, posSeparator + 1); 
    return temp; 
} 

El error va:
290 bytes en 12 bloques están definitivamente perdidos en pérdida de registro 1 de 1
Lo que hace la función es básicamente analiza la entrada, volviendo porciones de cadena separada por el carácter separador. Esta función se invoca desde el método de otra clase con la siguiente definición:

void doSomething(string input) { 
    input.erase(0,2); 
    string temp = nextField(input); 
    this->room = atoi(temp.c_str()); 
    temp = input; 
    this->money = atoi(temp.c_str()); 
} 

No hay nada raro o lo suficientemente importante como para ser incluido aquí. Utilizo la configuración predeterminada para Valgrind del perfil Valgrind de Eclipse Indigo. Alguna idea?

+3

¿Está optimizando durante la compilación? Si es así, no. Esto causa una gran cantidad de informes espurios de valgrind. –

+0

Probablemente podría escribir 'string temp = input.substr (0, posSeparador);' para inicializar la cadena en lugar de asignarla. Aunque no es obvio que tenga algo que ver con tu problema. –

+0

@DavidHammen No, no lo soy. – Erandros

Respuesta

0

No se comprueba si el posSeparador es realmente diferente de string :: npos: esto podría causar problemas en el borrado. Es un tiro salvaje, pero podría arreglar un error de todos modos.

1

Probablemente tenga un error en otro lugar en su fuente. Traté de reproducir el error utilizando el siguiente código:

#include <string> 
#include <iostream> 
#include <cstdlib> 

using namespace std; 

const char SEPARATOR = ':'; 

struct Foo 
{ 
public: 
    int room; 
    int money; 

    void doSomething(string input) { 
     input.erase(0,2); 
     string temp = nextField(input); 
     this->room = atoi(temp.c_str()); 
     temp = input; 
     this->money = atoi(temp.c_str()); 
    } 

    string nextField(string& input) { 
     int posSeparator = input.find_first_of(SEPARATOR); 
     string temp; 
     temp = input.substr(0, posSeparator); //Error points to this line 
     input.erase(0, posSeparator + 1); 
     return temp; 
    } 
}; 

int main() 
{ 
    Foo f; 
    f.doSomething("--234:12"); 
    std::cout << f.room << " - " << f.money << std::endl; 
} 

A continuación, una RAN valgrind:

valgrind --tool=memcheck <executable> 

y la salida era:

HEAP SUMMARY: 
    in use at exit: 0 bytes in 0 blocks 
    total heap usage: 2 allocs, 2 frees, 61 bytes allocated 

All heap blocks were freed -- no leaks are possible 

For counts of detected and suppressed errors, rerun with: -v 
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) 

Así que, probablemente, el problema no está en esta parte del código

2

Probablemente no sea un error en su código. Este error podría ser informado debido a los detalles de la implementación de la biblioteca estándar de C++. Para comprobar esto intente lo siguiente de Valgrind FAQ:

con gcc 2.91, 2.95, 3.0 y 3.1, la compilación de toda fuente con el STL con -D__USE_MALLOC. ¡Tener cuidado! Esto se eliminó de GCC comenzando con versión 3.3.

Con GCC 3.2.2 y posterior, debe exportar la variable de entorno GLIBCPP_FORCE_NEW antes de ejecutar su programa.

Con GCC 3.4 y posterior, esa variable ha cambiado el nombre a GLIBCXX_FORCE_NEW.

Cuestiones relacionadas