Вызов Malloc при удалении [] обнаруживается как утечка памяти в totalview

Я использую 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 ответа

Решение

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

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

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

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

Другие вопросы по тегам