0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 10
1

Delete после new char []

17.05.2022, 22:48. Показов 202. Ответов 3

Здравствуйте!
Есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
char* fName = new char[openFileDlg1->FileName->Length - 4]; // если не вычесть 4, то в fName в конце появляются 4 лишних символа
for (int i = 0; i < openFileDlg1->FileName->Length; i++)
    {
        fName[i] = openFileDlg1->FileName[i];
    }
ifstream myFile(fName);
if (myFile.is_open())
    {
              // Здесь какие-то действия с открытым файлом
        }
 
delete [] fName;
В Run-time при попытке освободить память, отведенную под fName, программа ломается со следующим сообщением:

"HEAP CORRUPTION DETECTED: after normal bock (#294) at 0x02E21810
CRT detected that the application wrote to memory after end of heap buffer."

Не могу понять, где здесь допущена ошибка. Подскажите, пожалуйста.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2022, 22:48
Ответы с готовыми решениями:

error: cannot delete expression of type 'char'
Здравствуйте. Я c++ всерьез начал заниматься недавно, и сегодня у меня вылезла ошибка, которую я...

Срабатывание точки останова на delete [] <тут char*>
Программа в процессе работы стопорится тут на строке 17 int main() { ... center(&quot;lol&quot;,...

Значения сохраняются в памяти после delete
#include &lt;conio.h&gt; #include &lt;iostream.h&gt; int main() { int *a = new int; cout &lt;&lt; a &lt;&lt; endl;...

Проблема с char**. Все элементы char** после выполнения функции приобретают одно и то же значение
Суть такая: сначала найти в введенной строке подстроку &quot;\ &quot; (например, &quot;mkdir my\ dir&quot;), и зменить...

Восстановить данных после случайно выполнение DELETE
Как восстановить данных если случайно выполняли DELETE FROM tab и это выполнили без написание...

3
16094 / 8692 / 2124
Регистрация: 30.01.2014
Сообщений: 14,984
17.05.2022, 22:53 2
Цитата Сообщение от AndreyM74 Посмотреть сообщение
Не могу понять, где здесь допущена ошибка.
вот здесь:
Цитата Сообщение от AndreyM74 Посмотреть сообщение
C++
1
for (int i = 0; i < openFileDlg1->FileName->Length; i++)
вы выделили Length - 4 байт. А в цикле итерируетесь до Length. Получаете выход за границы массива и последующее UB.

Добавлено через 1 минуту
Вам кстати очень четко написала среда об этом:
Цитата Сообщение от AndreyM74 Посмотреть сообщение
CRT detected that the application wrote to memory after end of heap buffer.
0
0 / 0 / 0
Регистрация: 06.12.2020
Сообщений: 10
17.05.2022, 23:21  [ТС] 3
DrOffset, спасибо! Я соглашусь с вами.
Но подскажите тогда, что за абракадабра из 4 символов приписывается в конце имени файла из свойства FileName ?
Как вообще правильно передавать строку с именем файла, чтобы потом с ним работать в контексте ifstream ?
Будьте любезны, если не трудно в личку, поскольку я понимаю, что это уже совсем другая проблема, выходящая за рамки начатой темы.
0
16094 / 8692 / 2124
Регистрация: 30.01.2014
Сообщений: 14,984
17.05.2022, 23:29 4
Цитата Сообщение от AndreyM74 Посмотреть сообщение
Но подскажите тогда, что за абракадабра из 4 символов приписывается в конце имени файла из свойства FileName ?
Отсутствие завершающего нуля.
Для этого выделять память надо на 1 байт больше.

C++
1
2
int Len = openFileDlg1->FileName->Length;
char* fName = new char[Len + 1];
А после цикла сделать:
C++
1
fName[Len] = 0;
И лучше изучите функции копирования строк (strcpy и т.п.), чтобы не писать такие циклы вручную.

Цитата Сообщение от AndreyM74 Посмотреть сообщение
если не трудно в личку
Перевод дискуссии в личку запрещен правилами форума.
Если ваш вопрос выходит за рамки темы, вы должны создать новую тему.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2022, 23:29
Помогаю со студенческими работами здесь

Удалит ли delete[] после измения типа указателя
... double *pd = new double; char *pc = (char*)pd; delete pc; ... Меня интерисует что...

CodeGear Bad parameter in process после delete
Доброго времени суток! Не могу понять в чем проблема. Есть dll (плагин), которую я пишу, он...

Что будет с указателем после использования операции delete?
Имеется код: #include &lt;iostream&gt; using namespace std; int main() { int *wtf_ptr; ...

Можно ли выполнить одним запросом ALTER после DELETE
Здравствуйте. Порывшись в интернете, нигде не нашёл как выполнить удаление, а после него...

Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться
Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться. кто сможет?...

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru