Я пишу программу, которая использует массивы символов/строки 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).
delete[] name;
в деструкторе должен покрывать его. Кроме того, рассматривали ли вы возможность использования std::string? Было бы проще управлять. Кроме того, я бы не стал возиться с переменной tempName. Я бы просто использовал this-›name char*. (Просто примечание о стиле, не связанное с правильностью) - person Corbin   schedule 24.04.2012const char *
. Кроме того, код, который вы разместили, предполагает, чтоnew
не является ошибкой, удаление [] в деструкторе правильно (если вы уже не освобождаете его где-то еще). Можете ли вы опубликовать полное определение класса? - person Corbin   schedule 24.04.2012