Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять про освобождение памяти, Работа с динамической памятью 
V
    Опции темы
greykardinal
Дата 13.2.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Тема поднималась уже не раз, но ответа я для себя не нашел.
В программме есть куча глобальных переменных:
Код

char **s =NULL;
//Обработанные данные
char **Wx=NULL;
char **Wx1=NULL;
char **Wy=NULL;
char **Wz=NULL;
char **Ax=NULL;
char **Ay=NULL;
char **Az=NULL;
char **T_Wxy=NULL;
char **T_Wxz=NULL;
char **T_Ax=NULL;
char **T_Ay=NULL;
char **T_Az=NULL;
float **M=NULL;
float *A=NULL;

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

void __fastcall TForm1::butStartClick(TObject *Sender)
{
s = new char *[Len];
M=new float *[Len];
Wx = new char *[Len];
Wx1 = new char *[Len];
Wy = new char *[Len];
Wz = new char *[Len];
Ax = new char *[Len];
Ay = new char *[Len];
Az = new char *[Len];
T_Wxy = new char *[Len];
T_Wxz = new char *[Len];
T_Ax = new char *[Len];
T_Ay = new char *[Len];
T_Az = new char *[Len];
for (int i=0;i<Len;i++) s[i]= new char[120];
for (int i=0;i<Len;i++) M[i]= new float[12];
for (int i=0;i<Len;i++) Wx[i]= new char[10];
for (int i=0;i<Len;i++) Wx1[i]= new char[10];
for (int i=0;i<Len;i++) Wy[i]= new char[10];
for (int i=0;i<Len;i++) Wz[i]= new char[10];
for (int i=0;i<Len;i++) Ax[i]= new char[10];
for (int i=0;i<Len;i++) Ay[i]= new char[10];
for (int i=0;i<Len;i++) Az[i]= new char[10];
for (int i=0;i<Len;i++) T_Wxz[i]= new char[10];
for (int i=0;i<Len;i++) T_Wxy[i]= new char[10];
for (int i=0;i<Len;i++) T_Az[i]= new char[10];
for (int i=0;i<Len;i++) T_Ax[i]= new char[10];
for (int i=0;i<Len;i++) T_Ay[i]= new char[10];
}


Код

void __fastcall TForm1::butExitClick(TObject *Sender)
{
delete s,Wx,Wy,Wz,Ax,Ay,Az,Wx1,T_Wxy,T_Wxz,T_Ax,T_Ay,T_Az,M,A,Predel;
}

После вызова delete память не освобождается (смотрю по Task'у), освобождается после вызова деструктора главной формы.
Всегда считал, что вызов delete уничтожает динамические объекты,  а тут не получается smile 
Подскажите , как мне освобождать память не закрывая главную форму smile 
ЗЫ. И подскажите, может я неправильно представляю механизм работы new-delete.
PM MAIL   Вверх
Artemon
Дата 13.2.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



чтобы удалить динамисеский массив, нужно писать так:

delete [] ArrayName;


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
zim22
Дата 13.2.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(greykardinal @  13.2.2010,  10:56 Найти цитируемый пост)
И подскажите, может я неправильно представляю механизм работы new-delete.

почитай Мейерса. "More effective C++". Правило 8

Это сообщение отредактировал(а) zim22 - 13.2.2010, 12:36


--------------------
PM MAIL   Вверх
Dem_max
Дата 13.2.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



delete s этим ты удалил только что выделил тут s = new char *[Len];
А вот тут ты выделил память s[i]= new char[120]; но не удалил ее.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
greykardinal
Дата 13.2.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Для простоты оставил только массив s[][]. Выделил память
Код

s = new char *[Len];
for (int i=0;i<Len;i++) s[i]= new char[120];

Написал вместо
Код

void __fastcall TForm1::butExitClick(TObject *Sender)
{
delete s,Wx,Wy,Wz,Ax,Ay,Az,Wx1,T_Wxy,T_Wxz,T_Ax,T_Ay,T_Az,M,A,Predel;
}

Код

void __fastcall TForm1::butExitClick(TObject *Sender)
{
delete [] s;
}


Толку никакого. Как забрала прога метров 80, так и висят они(((
Кто-нить может подсказать, как освободить память.
PM MAIL   Вверх
zim22
Дата 13.2.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(greykardinal @  13.2.2010,  17:08 Найти цитируемый пост)
Кто-нить может подсказать, как освободить память.


Цитата(Dem_max @  13.2.2010,  14:16 Найти цитируемый пост)
А вот тут ты выделил память s[i]= new char[120]; но не удалил ее.




--------------------
PM MAIL   Вверх
greykardinal
Дата 13.2.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Цитата(Dem_max @  13.2.2010,  14:16 Найти цитируемый пост)
А вот тут ты выделил память s[i]= new char[120]; но не удалил ее.

Я вас не понимаю. Разве не достаточно 
Код

delete [] s;

Если нет, подскажите как надо. Я считал, достаточно просто вызвать delete.
PM MAIL   Вверх
zim22
Дата 13.2.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(greykardinal @  13.2.2010,  17:45 Найти цитируемый пост)
delete [] s;

s - это массив указателей. 
когда ты его удаляешь - удаляются указатели на объекты. но не сами объекты.
перед удалением s нужно удалить все элементы в нём. для каждого из них вызывая delete / delete[]


--------------------
PM MAIL   Вверх
greykardinal
Дата 13.2.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Цитата

s - это массив указателей. 
когда ты его удаляешь - удаляются указатели на объекты. но не сами объекты.
перед удалением s нужно удалить все элементы в нём. для каждого из них вызывая delete / delete[]

Нечто вроде 
Код

for (i=0;i<Len;++) delete[] s;

Так?
PM MAIL   Вверх
zim22
Дата 13.2.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(greykardinal @  13.2.2010,  18:09 Найти цитируемый пост)
for (i=0;i<Len;i++) delete[] s[i];




--------------------
PM MAIL   Вверх
greykardinal
Дата 13.2.2010, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 29.9.2009

Репутация: нет
Всего: нет



Попробовал.
При i=0 ошибка:"Access violation at adress ... in module Project1.exe".
Похоже я пытаюсь обратиться к объекту, которого не существует. smile 
Я пока ничего не понимаю. к сожалению smile 

Все, разобрался. Была локальная копия поэтому шла ругань smile 
Всем большое спасибо за помощь

Это сообщение отредактировал(а) greykardinal - 13.2.2010, 20:19
PM MAIL   Вверх
Dem_max
Дата 13.2.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



запомни на каждый new должен быть delete


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.