Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освобождение памяти 
V
    Опции темы
oper54
  Дата 29.6.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброе время суток...
Вот какая задачка
есть структура типа
Код

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 отработает не корректно 
будит пытатся очистить не выделенную память... 
PM MAIL   Вверх
586
Дата 29.6.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ИМХО, функция clear не нужна.
Как создавал структура DATA, так и удаляй.
 
PM   Вверх
Romikgy
Дата 29.6.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



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 ){

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
oper54
Дата 29.6.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

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

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

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

 smile  а как же мне быть, память чистить то надо, а гарантировать что в структуре будит что то осмысленное я никак гарантировать не могу 
PM MAIL   Вверх
Romikgy
Дата 29.6.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
maxim1000
Дата 29.6.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



заполнять нулями сразу после создания 

Это сообщение отредактировал(а) maxim1000 - 29.6.2006, 18:49


--------------------
qqq
PM WWW   Вверх
vvpC
Дата 29.6.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(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 
 
PM MAIL WWW   Вверх
maalan
Дата 30.6.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как правильно заметил 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 
PM MAIL   Вверх
oper54
Дата 30.6.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



спасибо всем
 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  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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