В чем причина этой ошибки Valgrind? - PullRequest
6 голосов
/ 22 сентября 2011

Valgrind жалуется на вызов substr.

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;
}

Ошибка:
290 байтов в 12 блоках определенно потеряны в записи потерь 1 из 1
То, что делает функция, в основноманализировать ввод, возвращая части строки, разделенные символом SEPARATOR.Эта функция вызывается из метода другого класса со следующим определением:

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());
}

Нет ничего более странного или достаточно важного, чтобы включить его здесь.Я использую настройки по умолчанию для Valgrind из профилирования Eclipse Indigo's Valgrind.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Вероятно, это не ошибка в вашем коде. Об этой ошибке можно сообщить из-за деталей реализации стандартной библиотеки C ++. Чтобы убедиться в этом, попробуйте следующее из Valgrind FAQ :

С GCC 2.91, 2.95, 3.0 и 3.1 скомпилируйте весь исходный код, используя STL с -D__USE_MALLOC. Осторожно! Это было удалено из GCC, начиная с версия 3.3.

В GCC 3.2.2 и более поздних версиях вы должны экспортировать переменную среды GLIBCPP_FORCE_NEW перед запуском вашей программы.

В GCC 3.4 и более поздних версиях эта переменная сменила имя на GLIBCXX_FORCE_NEW.

1 голос
/ 22 сентября 2011

Возможно, у вас есть ошибка где-то еще в вашем источнике.Я попытался повторить ошибку, используя следующий код:

#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;
}

Затем запустил valgrind:

valgrind --tool=memcheck <executable>

и вывел:

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)

Итак,возможно, ваша проблема не в этой части кода

0 голосов
/ 23 сентября 2011

Вы не проверяете, действительно ли posSeparator отличается от string :: npos - это может вызвать проблемы при удалении.Это дикий выстрел, но он все равно может исправить ошибку.

...