C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Очистка памяти указателя, Можно ли так сделать?
Aptem
Отправлено: 10.02.2006, 21:07


Мастер участка

Группа: Участник
Сообщений: 349



Привет, всем.

Есть функция:
CODE
char * __fastcall TForm1::GetDataElement ( int offset, int length, AnsiString Filename )
{
 FILE *stream;
 char *data = new char[length];

 stream = fopen ( Filename.c_str(), "rb" );
 fseek ( stream, offset, SEEK_SET );
 fread ( data, length, 1, stream );
 fclose ( stream );

 return data;
}


Есть желание освобождать память из под указателя, так как length может достигать больших размеров, но как это осуществить? Если очистить память после return, то она не очиститься. Ставить очистку до return бессмысленно. Что делать?
Grigoriy
Отправлено: 10.02.2006, 22:07


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE

Если очистить память после return, то она не очиститься.


Неправда !
Память очистится нормально.
Потому что указатель data, возвращаемый функцией имеет то же значение, которое он имел внутри функции после выделения памяти.

Отредактировано Grigoriy — 10/02/2006, 22:11
Doga
Отправлено: 10.02.2006, 22:51


Мастер участка

Группа: Участник
Сообщений: 575



2Aptem
Освобождать память есть смысл только после использования полученных из файла данных во внешнем коде, иначе зачем тогда городить огород? Отсюда вывод — очисткой памяти должен заниматься тот код, который и использует эти данные, т.е. внешний, в котором вызывается GetDataElement(...). Или, простите за тафталогию, ещё более внешний biggrin.gif

P.S. Я бы добавил бы в код GetDataElement(...) проверку наличия файла, из которого должны читаться данные, проверку выхода суммы (offset + length) за размеры файла, а также число фактически прочитанных байтов, как одно из возвращаемых функцией значений.

P.P.S.
В данном контексте код
CODE

return data;

- это последнее, что будет выполнено в этой функции. Вы можете написать после этой строки ещё сколько хотите кода — зря потратите время. Даже если б это было не так, то как Вы представляете себе работу с этими данными? Вы выделяете память под массив, заполняете данными, передаёте во внешнюю функцию и тут же очищаете память массива? Что об этом должна подумать вышеупомянутая внешняя функция? В награду за такие вольности Вы бы получили бы как минимум AV!

Отредактировано Doga — 13/02/2006, 13:38
Valdemar
Отправлено: 13.02.2006, 10:05


Мастер участка

Группа: Участник
Сообщений: 433



Я бы выделил память для данных и передавал его в качестве параметра в функцию. И соответственно удалял бы после использования.
olegenty
Отправлено: 13.02.2006, 10:59


Ветеран

Группа: Модератор
Сообщений: 2412



а я в таких случаях вообще всегда пользуюсь auto_ptr< ...> — он сам чистит память после выхода из области видимости последнего вадельца.
Aptem
Отправлено: 13.02.2006, 13:43


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (olegenty @ 13/02/2006, 10:59)
а я в таких случаях вообще всегда пользуюсь auto_ptr< ... > — он сам чистит память после выхода из области видимости последнего вадельца.

Не могли бы приветси пример, ни разу не использовал вышеописанное.
Doga
Отправлено: 13.02.2006, 16:49


Мастер участка

Группа: Участник
Сообщений: 575



2olegenty

Сдается мне, что в последней версии (я про BOOST) есть вешь покруче smile.gif :

shared_ptr< ...>
olegenty
Отправлено: 13.02.2006, 16:52


Ветеран

Группа: Модератор
Сообщений: 2412



это зависит от цели использования. мне нужен именно auto_ptr, понадобился бы shared_ptr, я использовал бы именно его (boost у меня тоже установлен дома и на работе).
Doga
Отправлено: 13.02.2006, 17:14


Мастер участка

Группа: Участник
Сообщений: 575



2olegenty

Я понял Ваш намёк biggrin.gif

Вернуться в Вопросы программирования в C++Builder