Утечка памяти при выделении нового массива символов (строка c)

Я пишу программу, которая использует массивы символов/строки c. Всякий раз, когда я запускаю программу, valgrind выдает предупреждение о блоке «определенно потерянное»:

==8011== [X] bytes in [Y] blocks are definitely lost in loss record 1 of [Z]
==8011==    at 0x4A065BA: operator new[](unsigned long) (vg_replace_malloc.c:264)
==8011==    by 0x403D45: File::File(stat*, char const*) (File.cpp:15)
...

Это исходный код конструктора и деструктора (заголовок содержит определения для id, isDir, lastModified и name (имя имеет тип const char*)):

10  File::File(struct stat *statdat, const char* strName)
11  {
12    id = statdat->st_ino;
13    isDir = S_ISDIR(statdat->st_mode);
14    lastModified = (statdat->st_mtime);
15    char* tempName = new char[strlen(strName)+1];
16    strcpy(tempName, strName);
17    name = tempName;
18    tempName = NULL;
19  }
20  
21  File::~File()
22  {
23    //delete [] name;
24  }

У меня есть пара вопросов в связи с этим.

а) Попытка оставить удаление в деструкторе при компиляции и запуске приводит к мгновенному сбою из-за недопустимого указателя. Почему я не могу вызвать удаление массива символов?

б) Я думаю, что выделяю правильный объем памяти для массива. Что вызывает утечку памяти при выделении нового пространства? Ошибка возникает после остановки программы (после HEAP SUMMERY valgrind).


person Tanaki    schedule 23.04.2012    source источник
comment
delete[] name; в деструкторе должен покрывать его. Кроме того, рассматривали ли вы возможность использования std::string? Было бы проще управлять. Кроме того, я бы не стал возиться с переменной tempName. Я бы просто использовал this-›name char*. (Просто примечание о стиле, не связанное с правильностью)   -  person Corbin    schedule 24.04.2012
comment
@Корбин, это не работает. Во-первых, я не могу использовать strcpy для const char*, поэтому я использую tempName в качестве обходного пути. Во-вторых, раскомментирование удаления вызывает кучу жалоб valgrind на неинициализированные значения и недействительные free/delete/delete[] s.   -  person Tanaki    schedule 24.04.2012
comment
Второй аргумент strcpy — это const char *. Кроме того, код, который вы разместили, предполагает, что new не является ошибкой, удаление [] в деструкторе правильно (если вы уже не освобождаете его где-то еще). Можете ли вы опубликовать полное определение класса?   -  person Corbin    schedule 24.04.2012


Ответы (1)


Я определил проблему.

Моя проблема была с конструктором /default/. Поскольку оно не инициализировало «имя», ключевое слово удаления пыталось удалить нулевой указатель, когда деструктор вызывался для объекта, созданного конструктором по умолчанию. Я изменил свой конструктор по умолчанию для файла, чтобы инициализировать имя равным «\ 0», что, похоже, решило проблему.

person Tanaki    schedule 24.04.2012