![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Ostap |
|
||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 13.10.2005 Репутация: нет Всего: нет |
Если я объявляю функцию
Так как я явно не пишу free(any), то меня интересует освободится ли память после возращения значения? |
||||
|
|||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
А значение возвращено не будет. Будет возвращен указатель. А смысл освобождать? Ведь полученное значение будет использоваться впоследствии. -------------------- Теперь при чем :P |
|||
|
||||
Ostap |
|
||||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 13.10.2005 Репутация: нет Всего: нет |
Это корректный код? P.s. Я понимаю что можно сделать:
Но нужна схема, примерно описанная в первом случае. |
||||
|
|||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
Вот здесь и произойдет освобождение. А вот это необязательно, точнее даже: так делать не нужно. т.к. после выполнения в some будет указатель на другую область памяти, нежели выделенная первоначально. -------------------- Теперь при чем :P |
|||
|
||||
Ostap |
|
|||
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 13.10.2005 Репутация: нет Всего: нет |
Ага.
Т.е. будет достаточно одного calloc в теле вызываемой функции? Спасибо. |
|||
|
||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
Всегда пожалуйста ![]() Но я бы предпочел второй вариант, т.е. передать указатель как параметр. При таком решении calloc и free находятся в одной функции, а в том варианте, который сейчас - в разных. Технически разницы нет, когда выделять, когда освобождать, но повышается читабельность кода (ИМХО). -------------------- Теперь при чем :P |
|||
|
||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Повышается безопасность кода.
-------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
Breezy |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: 1 Всего: 1 |
Ignat
Ты уверен? Человеку нужен конструктор и деструктор... Следовательно стоит написать нечто подобное на вектор ... тоесть управлять памятью не прямо. просто вот такой прикол:
а ведь можно сделать обертку чото типа:
И можно удалять память до бесконечности... |
||||||
|
|||||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
А есть другие варианты? ![]() Как гарант корректного освобождения это хороший вариант. -------------------- Теперь при чем :P |
|||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: 1 Всего: 1 |
Ignat
Если делать обертку для освобождения то неплохобы сделать и для выделения памяти ![]() |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
тогда уж лучше
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 3 Всего: 73 |
-------------------- Теперь при чем :P |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Таким образом мы не нарушаем стандартное поведение free. free(NULL) - это абсолютно легальная конструкция.(так же как и delete NULL кстати говоря). MyFree(NULL) в оригинале просто вылетит. Смысла в этом if'е воообще никакого нет. Убери его - никто не заметит абсолютно никакой разницы. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: 1 Всего: 1 |
Mayk,
абсолютно легально ето правда но иногда кроме удаления памяти надо еще чтото удалить, это решать уже надо от конкретной задачи... если уж на то пошло то код должен принять вид void MyFree(void **pData); { if(pData!=0) { free(*pData); *pData=0;//ошибочка закралась } } |
|||
|
||||
DeadSoul |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Breezy, именно так. А если заменить malloc на new, free на delete, то можно возвращать прямо std::vector(using ReturnValueOptimisation) Или(используем new+delete, а не malloc+free!):
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |