Удаление динамического массива char в C ++ - PullRequest
1 голос
/ 04 мая 2010

У меня есть этот класс с атрибутом «слово»

class Node {
    char *word;

Внутри конструктора Node я делаю это присвоение:

word = new char[strlen(someword)];

В деструкторе класса Node я пытаюсь удалить содержимое, обозначенное словом:

delete []word;

Я получаю следующее сообщение после выполнения программ:

"Блок кучи в 003E4F48, измененный в 003E4F51, после запрошенного размера 1"

Что я не очень хорошо делаю?

Ответы [ 3 ]

6 голосов
/ 04 мая 2010

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

word = new char[strlen(someword) + 1];  // +1 for null terminator
...
strcpy(word, someword);

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

Вам также следует рассмотреть возможность использования класса std::string, который автоматически управляет памятью, чтобы вам не приходилось сталкиваться с такими тонкими проблемами, как эта.

1 голос
/ 04 мая 2010

У вас поврежденная куча - где-то еще в вашем коде вы пишете за пределами выделенной памяти или удаляете что-то, чего не должно быть - вы уверены, что не имеете в виду strlen (someworrd) + 1 ?. Лучшее решение этой проблемы - использовать std:; string или std :: vector вместо динамического массива.

1 голос
/ 04 мая 2010

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

word = new char[strlen(someword) + 1];
...