Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
commeta
0 / 0 / 0
Регистрация: 01.07.2012
Сообщений: 15
#1

Освобождение памяти (удаление массива char) и raised exception class EAccessViolation - C++

01.07.2012, 02:07. Просмотров 1314. Ответов 4
Метки нет (Все метки)

Подскажите плиз, есть программа, вот кусок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        AnsiString inputText;
        int inputTextLength;
        inputText= Form1->Edit1->Text;
        inputTextLength= inputText.Length() + 1;
 
        char *Buffer = new char[inputTextLength];
        ZeroMemory(Buffer, inputTextLength);
        char *BufferDst = new char[inputTextLength];
        ZeroMemory(BufferDst, inputTextLength);
 
        Buffer= inputText.c_str();
        int leftDgt= 0;
        for(int i=0; i<inputTextLength - 1; i++)
        {
            if (isdigit((unsigned char)Buffer[i]))
            {
              BufferDst[leftDgt]= Buffer[i];
              leftDgt++;
            }
        }
 
        inputText= (AnsiString)BufferDst;
        summ= inputText.ToDouble();
 
        //Tild
        Form1->Edit1->Text= inputText;
 
        delete[] BufferDst;
освобождаю память от BufferDst, все проходит нормально, а когда пытаюсь освободить от Buffer - строчкой
C++
1
delete[] Buffer;
программа вылетает с Project2 raised exception class EAccessViolation with message 'Access violation at address 211A46A3 in module 'BORLANDMM.DLL'. Read of address 000000008'.

В чем грабли???


ЗЫ: Borland c++ builder 2007 - VCL FORMS Application
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2012, 02:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Освобождение памяти (удаление массива char) и raised exception class EAccessViolation (C++):

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA - C++
Выдает ошибку raised exception class EAccessViolation with message 'Access violation at address 004011FA... на строке { fputc (c,b);}....

First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process - C++
Объясните в каких случаях возникает эта ошибка, из-за чего? Как справиться с этой ошибкой? Только плиз на примере и доступными словами, т....

Project raised exception class EConvertError - C++
Вот такая ошибка: Project Project1.exe raised exception class EConvertError with message &quot;2.1&quot; is not a valid integer value. Process...

Освобождение памяти у динамического массива char - C++
Добрый день. Имеем код: class _ArrayChar { typedef int Ivalue; typedef char* Pchar; typedef const char Cchar;

Массивы и строки char + освобождение памяти - C++
Не понимаю когда нужно освобождать память когда нет? Когда пользоваться delete если я объявляю char *Name=new char; ему...

Освобождение памяти для динамического масива типа char - C++
Здравствуйте, помогите пожалуйста разобраться с одним моментом. При освобождении памяти двумерного динамического массива типа char, в конце...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Hrundel
26 / 26 / 2
Регистрация: 27.05.2012
Сообщений: 114
01.07.2012, 02:26 #2
А его не надо удалять. Это же указатель. Ты его создаешь пустым. Потом кладешь туда яблоко. Потом забираешь оттуда яблоко (удаляешь BufferDst) а потом хочешь еще раз забрать оттуда яблоко? А там уже ничего нет. Сам Buffer удалять не надо. Он уже пустой.
commeta
0 / 0 / 0
Регистрация: 01.07.2012
Сообщений: 15
01.07.2012, 02:33  [ТС] #3
я думал что выделяю память для двух char массивов в обработчике события, и при каждом возникновении события у меня по новой выделяется для них память, поэтому и освобождаю в конце обработчика - чтобы утечек небыло... Значит BufferDst удалять надо а Buffer нет!
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
01.07.2012, 03:03 #4
вот тут
C++
1
Buffer= inputText.c_str();
то, на что указывает Buffer, принадлежит объекту inputText, поэтому не надо удалять

Добавлено через 28 минут
и еще

вот это
C++
1
2
char *Buffer = new char[inputTextLength];
        ZeroMemory(Buffer, inputTextLength);
надо заменить на
C++
1
char *Buffer;
ведь Buffer просто указывает на inputText.c_str() и выделенная память теряется
commeta
0 / 0 / 0
Регистрация: 01.07.2012
Сообщений: 15
01.07.2012, 03:09  [ТС] #5
Цитата Сообщение от defer Посмотреть сообщение
вот тут
C++
1
Buffer= inputText.c_str();
то, на что указывает Buffer, принадлежит объекту inputText, поэтому не надо удалять

Добавлено через 28 минут
и еще

вот это
C++
1
2
char *Buffer = new char[inputTextLength];
        ZeroMemory(Buffer, inputTextLength);
надо заменить на
C++
1
char *Buffer;
ведь Buffer просто указывает на inputText.c_str() и выделенная память теряется
Благодарю, я как раз думал над этим участком.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2012, 03:09
Привет! Вот еще темы с ответами:

Удаление объекта и освобождение памяти - C++
Есть вот такой код. Интересуют выделенные ф-и. Последняя ясна - мы просто возвращаем память нашей ОС. Предпоследняя уничтожает объект...

Освобождение памяти, удаление бинарного дерева - C++
Добрый день. Написал программу, которая ищет в файле неиспользуемые переменные, т.е. те, которые объявлены. Всё в общем-то работает, но...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Освобождение памяти динамического массива структур - C++
Поставлена следующая задача: сделать любую структуру, сгененировать в неё рандомные данные, записать в бинарник. Потом считать из...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.07.2012, 03:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru