Re[3]: Как правильно освободить память от массива символов, полученных из функци
От: Carc Россия http://www.amlpages.com/home.php
Дата: 28.04.15 13:20
Оценка: +2
Здравствуйте, borya_ilin, Вы писали:

C>> То бишь вызывающая функция должна передать в вызываемую функцию уже готовый массив. И сама же потом его освободить. Вызывающей функции лучше знать откуда и как распределялась память под массив, и что с ней потом делать.


_>А какого размера должен быть массив, который передаётся в функцию?

_>Функция, к примеру, сжатый файл в буфер читает.
Что делать? Гипс снимают! Клиент уезжает! Шеф! Все пропало! Все пропало!

Это разговор отдельный. Как определять. Вариантов масса.

1. Можно использовать WinAPI like стиль. Если присмотреться к функциям WinAPI, то часто используется следующий прием.
Передается указатель на массив для записи результатов чего то, и его размер. В случае успеха функция возвращает число записанных в результирующий массив элементов. Дык вот очень часто оговаривается вариант, что если передать в функцию NULL или максимальный размер элементов в ноль, то она вернет сколько ей надо места для записи.

2. Если случай сложный, или накладный как чтение файлов, то следует передавать не массив в функцию, а объект который сможет сам управлять своим размером, и знает и как это лучше сделать.

Но в любом случае, всегда стоит стараться избегать такого управления памятью, в стиле "Батяня, слышь? Рубит! А я отвожу". Код не лес, и тут такие бубны добром не кончаются. Примеров до упячки можно привести. В контексте стартового топика: в одном месте new, в другом delete. Ну это все хорошо пока какой-нить пьянь супер-пупер-гик не перегрузит new для типа. И подставит собственный аллоктор. На стандартном delete[] словим в общем случае вообще что-угодно, кроме корректного выполнения.

Так что в таких вариантах лучше сразу приучаться четко задавать аллокатор памяти.

А примеров таких проблема масса. Пока все в пределах одного модуля — все прекрасно. Как только в разных, запросто можем получить проблемную ситуацию.

Это конечно все разговоры про архитектуру, а у меня сложилось впечатление, что вопрошающий только разбирается вообще что называется с синтаксисом. Тогда конечно архитектурные разговоры в сторону, но уж и тогда про "чтение сжатого файла" тоже в сторону — это тут и еще больше будет не причем.

А вот про то что, в функцию можно передать массив под данные и его размер, упомянуть стоит. Нехай молодежь учится сразу, пусть хотя бы "держа в уме" про такой прием. Это лучше, чем переучиваться и заново ломать чужие копья.
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.