Вызов Malloc при удалении [] обнаруживается как утечка памяти в totalview - PullRequest
2 голосов
/ 23 декабря 2009

Я использую HDF5 для чтения строки в char*, выделенном new[]. Затем я использую вызов string :: assign (), чтобы скопировать эти данные туда, где я на самом деле их хочу. Затем я звоню delete[] на этом персонаже *. Это обнаруживается как источник утечки памяти, используя totalview. Он показывает искаженные вызовы в stdlibc ++ с номерами от delete[] до replace_safe, mutate, create, затем malloc. Что происходит, и действительно ли это утечка памяти? Я также установил GLIBCXX_FORCE_NEW=1 здесь.

Вот пример кода, который дублирует ситуацию. Обратите внимание, что valgrind не показывает утечек, и если я не установлю точку останова перед вызовом cout, утечка не найдена в totalview.

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

int main()
{
    std::string str;

    int len = strlen(getenv("PATH"));
    char* x = new char[len + 1];
    strcpy(x, getenv("PATH"));
    x[len] = '\0';

    str.assign(x);

    delete[] x;

    std::cout << str << std::endl;
}

Ответы [ 2 ]

3 голосов
/ 23 декабря 2009

Все должно быть в порядке:
Но я бы предложил использовать std :: vector, а не обновлять массив char:

std::vector<char>  x(len+1);
strcpy(&x[0], getenv("PATH"));

Причина, по которой я бы сделал это, заключается в том, что метод assign () потенциально может вызвать исключение. Таким образом, удаление не может быть вызвано, и, таким образом, вы можете получить утечку при наличии исключения. Используя вектор, который вы получаете, память очищается из-за RAII.

2 голосов
/ 23 декабря 2009

Не связано с утечкой, но если вы знаете длину, предпочитайте strncpy более strcpy

...