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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
commeta
0 / 0 / 0
Регистрация: 01.07.2012
Сообщений: 15
01.07.2012, 02:07     Освобождение памяти (удаление массива char) и raised exception class EAccessViolation #1
Подскажите плиз, есть программа, вот кусок
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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hrundel
25 / 25 / 2
Регистрация: 27.05.2012
Сообщений: 114
01.07.2012, 02:26     Освобождение памяти (удаление массива char) и raised exception class EAccessViolation #2
А его не надо удалять. Это же указатель. Ты его создаешь пустым. Потом кладешь туда яблоко. Потом забираешь оттуда яблоко (удаляешь BufferDst) а потом хочешь еще раз забрать оттуда яблоко? А там уже ничего нет. Сам Buffer удалять не надо. Он уже пустой.
commeta
0 / 0 / 0
Регистрация: 01.07.2012
Сообщений: 15
01.07.2012, 02:33  [ТС]     Освобождение памяти (удаление массива char) и raised exception class EAccessViolation #3
я думал что выделяю память для двух char массивов в обработчике события, и при каждом возникновении события у меня по новой выделяется для них память, поэтому и освобождаю в конце обработчика - чтобы утечек небыло... Значит BufferDst удалять надо а Buffer нет!
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
01.07.2012, 03:03     Освобождение памяти (удаление массива char) и raised exception class EAccessViolation #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  [ТС]     Освобождение памяти (удаление массива char) и raised exception class EAccessViolation #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() и выделенная память теряется
Благодарю, я как раз думал над этим участком.
Yandex
Объявления
01.07.2012, 03:09     Освобождение памяти (удаление массива char) и raised exception class EAccessViolation
Ответ Создать тему
Опции темы

Текущее время: 02:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru