Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > освобождение памяти после выхода из функции |
Автор: Ostap 15.2.2006, 13:21 | ||||
Если я объявляю функцию
Так как я явно не пишу free(any), то меня интересует освободится ли память после возращения значения? |
Автор: Ostap 15.2.2006, 15:13 | ||||
Это корректный код? P.s. Я понимаю что можно сделать:
Но нужна схема, примерно описанная в первом случае. |
Автор: Ignat 15.2.2006, 15:19 |
Вот здесь и произойдет освобождение. А вот это необязательно, точнее даже: так делать не нужно. т.к. после выполнения в some будет указатель на другую область памяти, нежели выделенная первоначально. |
Автор: Ostap 15.2.2006, 15:43 |
Ага. Т.е. будет достаточно одного calloc в теле вызываемой функции? Спасибо. |
Автор: Ignat 15.2.2006, 15:50 |
Всегда пожалуйста ![]() Но я бы предпочел второй вариант, т.е. передать указатель как параметр. При таком решении calloc и free находятся в одной функции, а в том варианте, который сейчас - в разных. Технически разницы нет, когда выделять, когда освобождать, но повышается читабельность кода (ИМХО). |
Автор: Neitron 15.2.2006, 15:53 |
Повышается безопасность кода. |
Автор: Breezy 16.2.2006, 10:48 | ||||||
Ignat
Ты уверен? Человеку нужен конструктор и деструктор... Следовательно стоит написать нечто подобное на вектор ... тоесть управлять памятью не прямо. просто вот такой прикол:
а ведь можно сделать обертку чото типа:
И можно удалять память до бесконечности... |
Автор: Ignat 16.2.2006, 11:27 |
А есть другие варианты? ![]() Как гарант корректного освобождения это хороший вариант. |
Автор: Breezy 16.2.2006, 14:43 | ||
Ignat
Если делать обертку для освобождения то неплохобы сделать и для выделения памяти ![]() |
Автор: Mayk 16.2.2006, 14:45 | ||
тогда уж лучше
|
Автор: Ignat 16.2.2006, 14:55 |
Ээээ... Чем? |
Автор: Mayk 16.2.2006, 15:03 |
Таким образом мы не нарушаем стандартное поведение free. free(NULL) - это абсолютно легальная конструкция.(так же как и delete NULL кстати говоря). MyFree(NULL) в оригинале просто вылетит. Смысла в этом if'е воообще никакого нет. Убери его - никто не заметит абсолютно никакой разницы. |
Автор: Breezy 16.2.2006, 16:41 |
Mayk, абсолютно легально ето правда но иногда кроме удаления памяти надо еще чтото удалить, это решать уже надо от конкретной задачи... если уж на то пошло то код должен принять вид void MyFree(void **pData); { if(pData!=0) { free(*pData); *pData=0;//ошибочка закралась } } |
Автор: DeadSoul 16.2.2006, 22:36 | ||||
Breezy, именно так. А если заменить malloc на new, free на delete, то можно возвращать прямо std::vector(using ReturnValueOptimisation) Или(используем new+delete, а не malloc+free!):
|
Автор: Ignat 17.2.2006, 10:52 |
Для чистых сей низзя ![]() |
Автор: DeadSoul 17.2.2006, 23:02 | ||
Ты уверен, что у человека чистые Си? |
Автор: Ignat 17.2.2006, 23:14 |
Нет, но зачем юзать malloc в С++ ума не приложу, там есть new. Пока скудные фрагменты кода, которые видели больше тянут на чистые Си. |
Автор: DeadSoul 17.2.2006, 23:48 | ||
От незнания |