Обнаружено повреждение кучи, где я могу удалить динамическую память? - PullRequest
0 голосов
/ 20 августа 2011

Я получаю эту ошибку, но не могу понять, когда можно удалить динамическую память для переменных: upSizedPlaintext, upsizedKey, upsizedCiphertext или upsizedKeyD?

Поскольку я делаю это для назначенияЯ должен использовать тесты BOOST, и в тесте, который будет использовать лектор, он удалит encryptedText и расшифровал в тесте BOOST.Но мне не удается выяснить, где я могу удалить переменные сверху.Любые идеи и любая помощь с благодарностью?

Кроме того, я должен использовать строки в стиле C, а не строки C ++.

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Когда вы возвращаете указатели на новую память из шифрования и дешифрования, код, вызывающий эти функции, становится ответственным за вызов delete[] для указателей, которые они получают.

Не очень хороший интерфейс и одна из причин, почему нам нравится использовать std :: string в коде C ++!

Обычный источник повреждения кучи в коде C - забыть терминатор nul для строк и выделить strlen(s) байтов вместо strlen(s) + 1 байтов. Я верю, что вы делаете это в нескольких местах.

1 голос
/ 20 августа 2011

Похоже, та же проблема для меня

char * decrypted = new char[lengthOfCiphertext];

должно быть

char * decrypted = new char[lengthOfCiphertext + 1];

Та же проблема в разных местах. Повреждение кучи не потому, что вы удаляете в неподходящее время, а потому, что вы пишете за пределами выделенной памяти. В этом случае, потому что вы выделяете слишком мало байтов.

0 голосов
/ 20 августа 2011

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

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

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

...