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


Автор: oper54 29.6.2006, 17:41
Доброе время суток...
Вот какая задачка
есть структура типа
Код

struct DATA{
 char* name;
 char* date;
 char* n;
}

для нее функция
Код

void clear( DATA* pd ){
 if( pd->name && pd->date && pd->n ){
  free( pd->name );
  free( pd->date );
  free( pd->n );
 }
}

есть класс
Код

class cl{
public:
 cl(){ pdata = ( DATA* )malloc( sizeof( DATA ) ); }
 ~cl(){ clear( pdata ); free( pdata ); }
private:
 DATA* pdata;
};

вот в чем загвоздка
если не инициировать елементы структуры DATA то функция clear отработает не корректно 
будит пытатся очистить не выделенную память... 

Автор: 586 29.6.2006, 17:51
ИМХО, функция clear не нужна.
Как создавал структура DATA, так и удаляй.
 

Автор: Romikgy 29.6.2006, 18:14
oper54
Цитата(oper54 @  29.6.2006,  16:41 Найти цитируемый пост)
cl(){ pdata = ( DATA* )malloc( sizeof( DATA ) ); }

http://www.freebsd.org.ua/man/malloc.3.html
Цитата(oper54 @  29.6.2006,  16:41 Найти цитируемый пост)
вот в чем загвоздка
если не инициировать елементы структуры DATA

 Учтите, что malloc() НЕ заполняет выделенную память нулями.

т.е. 
Цитата(oper54 @  29.6.2006,  16:41 Найти цитируемый пост)
if( pd->name && pd->date && pd->n ){

эти указатели могут содержать мусор, и ссылка на мусор уничтожатся не будет 

Автор: oper54 29.6.2006, 18:22
Цитата

ИМХО, функция clear не нужна.
Как создавал структура DATA, так и удаляй

функция clear нужна, работать с структурой никто на прямую(почти)
не будит, а через класс, вот в деструкторе и будит вызвана эта функция, или
когда произойдет следующее ее заполнение.

Цитата(Romikgy @  29.6.2006,  18:14 Найти цитируемый пост)
эти указатели могут содержать мусор, и ссылка на мусор уничтожатся не будет 

 smile  а как же мне быть, память чистить то надо, а гарантировать что в структуре будит что то осмысленное я никак гарантировать не могу 

Автор: Romikgy 29.6.2006, 18:37
Цитата(oper54 @  29.6.2006,  16:41 Найти цитируемый пост)
cl()

А на кой тебе это 
вот в нем и выделяй и очищай дабы потом глюков небыло и имхо лучше юзать new & delete 

Автор: maxim1000 29.6.2006, 18:47
заполнять нулями сразу после создания 

Автор: vvpC 29.6.2006, 20:49
Цитата(oper54 @  29.6.2006,  17:41 Найти цитируемый пост)
free( pd->name );
  free( pd->date );
  free( pd->n );

откуда free знает про то что выделена была память или нет.. smile при создании структуры,  для начала, не мешало бы все указатели обнулить..в чем проблем собственно и непонятно..

Цитата(oper54 @  29.6.2006,  17:41 Найти цитируемый пост)
если не инициировать елементы структуры DATA то функция clear отработает не корректно
  smile а вообще как работать с указателями, никто не пытался узнать? smile 
 

Автор: maalan 30.6.2006, 11:20
как правильно заметил vvpC
Цитата
при создании структуры,  для начала, не мешало бы все указатели обнулить..в чем проблем собственно и непонятно..


Код

struct DATA{
 char* name;
 char* date;
 char* n;
 DATA() {name=0; date=0; n=0;}
 ~DATA() 
    {
    // я бы написал так, но если есть гарантия, что обязательно
    // будут использованы все указатели, то можно обойтись
    // и одним if
    if (n!=0) free(n);
    if (date!=0) free(date);
    if (name!=0) free(name);
    // ну и, конечно, я бы free-malloc заменил на delete-new
    }
};


имхо, теперь функция clear вообще не нужна

Код

class cl{
public:
 cl(){ pdata = new DATA; }
 ~cl(){delete pdata; }
private:
 DATA* pdata;
};


и остается вопрос, что будет, если написать, например, так:
Код

void _fastcall Func()
{
cl a;
a.pdata->name = "asdsd";
}

тут память очищать не надо! а очистка сработает! почти наверняка вылетит exception 

Автор: oper54 30.6.2006, 13:35
спасибо всем
 smile free и malloc на delete и new не хочу менять, не нравятся мне эти операторы...

Добавлено @ 13:38 
Цитата(maalan @  30.6.2006,  11:20 Найти цитируемый пост)
и остается вопрос, что будет, если написать, например, так:

код C++ Builder    
1:    
2:    
3:    
4:    
5:    
void _fastcall Func()    
{    
cl a;    
a.pdata->name = "asdsd";    
}    

тут память очищать не надо! а очистка сработает! почти наверняка вылетит exception 

такого быть не может - структура, покрайней мере, в моей программе
на прямую использоваться будет только для считывания данных, и то не напрямую, а через класс...
просто не продумал сразу, сказали сделать быстро вот и получилось "ЭТО", а менять что то уже лень  smile  

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