реклама на сайте
подробности

 
 
> Возвращение указателя на динамический массив
Nikitoc
сообщение Mar 1 2012, 15:03
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Всем привет!
Вопросик простой, но для полноты картины происходящего в компиляторе (или в МК) мне нужно этот вопрос разъяснить. Допустим, есть какая-то функция:
Код
WORD *Multiple (BYTE A, BYTE B){
           WORD *result;
           result = (WORD *)malloc(1);
           *result = A * B;
           return result;
       }


Собственно вопросы:

1. Где необходимо удалять эту переменную result (я имею в виду вызов ф-ции free())? Только в той функции, в которой она была выделена (Multiple()) или же можно сделать это в вызывающей функции по полученному указателю?
2. Я правильно понимаю, что возвращать указатель можно потому, что динамически выделенная переменная помещается в кучу, а не в стек?
3. Как называется область оперативной памяти, которая не отводится под кучу или стек? Как она используется компилятором (что туда "ложится")?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Ivana
сообщение Mar 1 2012, 20:17
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710



Как интересно-то! sm.gif
Лично я бы стал пользоваться менеджером памяти только если мне нужно в проекте последовательно создавать/уничтожать определенное количество разноформатных данных. Если формат динамических переменных условно одинаковый (или в течение работы программы отличается незначительно), то проще было бы использовать заранее нарезанные статические куски определенных типов, только использовать их для разных целей на каждом этапе.

ЗЫ но конечно на непредсказуемых вещах типа компьютера без динамического выделения никак sm.gif

Цитата
поскольку result перестал существовать после выхода из этой функции - выделенный участок кучи вернуть обратно невозможно.

Если бы я писал менеджер памяти, я бы предусмотрел функцию free_all() которая освобождает всю кучу. Вызывать её в редкие моменты когда там нет нужных переменных - и все потерянные куски возвратятся sm.gif Или я слишком оптимистичен и пустой куча не бывает никогда?

Сообщение отредактировал _Ivana - Mar 1 2012, 20:20
Go to the top of the page
 
+Quote Post
XVR
сообщение Mar 2 2012, 08:40
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(_Ivana @ Mar 2 2012, 00:17) *
Если формат динамических переменных условно одинаковый (или в течение работы программы отличается незначительно), то проще было бы использовать заранее нарезанные статические куски определенных типов, только использовать их для разных целей на каждом этапе.
Это называется 'пул памяти' (memory pool). Хорошо известная и часто используемая структура динамической памяти. Да и классические кучи (heap'ы) бывают разные. Например вот
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Nikitoc   Возвращение указателя на динамический массив   Mar 1 2012, 15:03
- - ys05   Цитата(Nikitoc @ Mar 1 2012, 18:03) 1. Гд...   Mar 1 2012, 15:59
- - toweroff   ойой возвращать из функции адрес локальной перемен...   Mar 1 2012, 16:09
|- - xemul   Цитата(toweroff @ Mar 1 2012, 20:09) ойой...   Mar 1 2012, 16:20
|- - toweroff   Цитата(xemul @ Mar 1 2012, 20:20) Возвращ...   Mar 1 2012, 16:40
- - Сергей Борщ   QUOTE (Nikitoc @ Mar 1 2012, 17:03) 1. Гд...   Mar 1 2012, 18:18
|- - toweroff   Цитата(Сергей Борщ @ Mar 1 2012, 22:18) И...   Mar 1 2012, 18:28
|- - xemul   Цитата(Сергей Борщ @ Mar 1 2012, 22:18) К...   Mar 1 2012, 18:54
|- - _Pasha   Цитата(xemul @ Mar 1 2012, 21:54) Я не пр...   Mar 2 2012, 01:34
- - Nikitoc   Всем спасибо за ответы. Вопрос Сергею: я спросил п...   Mar 1 2012, 18:54
- - _Ivana   Это стОит того, чтобы ждать! Так и я пойму да...   Mar 1 2012, 19:39
- - Сергей Борщ   QUOTE (toweroff @ Mar 1 2012, 20:28) то е...   Mar 1 2012, 19:44
- - toweroff   Цитата(Сергей Борщ @ Mar 1 2012, 23:44) В...   Mar 1 2012, 19:51
|- - Сергей Борщ   QUOTE (toweroff @ Mar 1 2012, 21:51) полу...   Mar 1 2012, 20:10
- - Nikitoc   Сергей, спасибо Вам большое. Разжевано предельно п...   Mar 1 2012, 19:57
- - _Ivana   Со стеком имхо ничего не поможет справиться, кроме...   Mar 1 2012, 20:00
|- - toweroff   Цитата(_Ivana @ Mar 2 2012, 00:00) Со сте...   Mar 1 2012, 20:03
- - toweroff   То есть "в лоб" - (как уже упомянали) - ...   Mar 1 2012, 20:24
- - _Ivana   Ладно, уговорили: free_всё_кроме_заполненного_масс...   Mar 1 2012, 20:30
|- - Сергей Борщ   QUOTE (_Ivana @ Mar 1 2012, 22:30) просто...   Mar 1 2012, 20:55
- - toweroff   Цитата(_Ivana @ Mar 2 2012, 00:30) Ладно,...   Mar 1 2012, 21:00
- - _Ivana   Это было на правах фантазии дилетанта Убирать в к...   Mar 1 2012, 21:07
- - _Ivana   XVR спасибо, очень интересно и познавательно!   Mar 2 2012, 15:00
- - Idle   Цитатаresult = (WORD *)malloc(1); вылезаешь за гра...   Mar 3 2012, 13:41


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 01:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016