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(...). Или, простите за тафталогию, ещё более внешний
P.S. Я бы добавил бы в код GetDataElement(...) проверку наличия файла, из которого должны читаться данные, проверку выхода суммы (offset + length) за размеры файла, а также число фактически прочитанных байтов, как одно из возвращаемых функцией значений.
P.P.S.
В данном контексте код
- это последнее, что будет выполнено в этой функции. Вы можете написать после этой строки ещё сколько хотите кода — зря потратите время. Даже если б это было не так, то как Вы представляете себе работу с этими данными? Вы выделяете память под массив, заполняете данными, передаёте во внешнюю функцию и тут же очищаете память массива? Что об этом должна подумать вышеупомянутая внешняя функция? В награду за такие вольности Вы бы получили бы как минимум 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) есть вешь покруче :
shared_ptr< ...>
|
|
olegenty |
Отправлено: 13.02.2006, 16:52 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
это зависит от цели использования. мне нужен именно auto_ptr, понадобился бы shared_ptr, я использовал бы именно его (boost у меня тоже установлен дома и на работе).
|
|
Doga |
Отправлено: 13.02.2006, 17:14 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
2olegenty
Я понял Ваш намёк
|
|