Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Опять про освобождение памяти


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

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.

Автор: Artemon 13.2.2010, 12:28
чтобы удалить динамисеский массив, нужно писать так:

delete [] ArrayName;

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

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

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

Автор: greykardinal 13.2.2010, 18:08
Для простоты оставил только массив 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, так и висят они(((
Кто-нить может подсказать, как освободить память.

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


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


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

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

delete [] s;

Если нет, подскажите как надо. Я считал, достаточно просто вызвать delete.

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

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

Автор: greykardinal 13.2.2010, 19:09
Цитата

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

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

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

Так?

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


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

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

Автор: Dem_max 13.2.2010, 20:49
запомни на каждый new должен быть delete

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)