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

 
 
> Возвращение указателя на динамический массив
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
Ответов
toweroff
сообщение Mar 1 2012, 19:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Сергей Борщ @ Mar 1 2012, 23:44) *
В основном именно для борьбы с ней и существуют различные менеджеры памяти.
В этой функции не возвращается адрес локальной переменной. Возвращается указатель на какую-то точку глобальной кучи

получается, что информация о куче хранится в какой-то реализации связанного списка там же, в области кучи (ну пока другого варианта не вижу)
отсюда и сложность в использовании оной?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 1 2012, 20:10
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (toweroff @ Mar 1 2012, 21:51) *
получается, что информация о куче хранится в какой-то реализации связанного списка там же, в области кучи (ну пока другого варианта не вижу)
В простейших вариантах - да, именно так и делается. Слышал, что есть более сложные, в которых список хранится отдельно, но не изучал этот вопрос, поэтому врать не буду. Если у процессора есть MMU и он используется менеджером памяти - все должно быть еще запутанней и интересней.
QUOTE (toweroff @ Mar 1 2012, 21:51) *
отсюда и сложность в использовании оной?
Нет, это все делает библиотечный (или самописный) менеджер памяти. Сложность в слабо прогнозируемой дефрагментации, борьбе с ней и "утечками памяти", а их допустить очень просто, именно на них и намекает xemul:
CODE
void eat_my_memory()
{
     int * result = malloc(sizeof int, 10);
     printf(" Я украл у вас немного памяти. Насовсем :-P");
}
поскольку result перестал существовать после выхода из этой функции - выделенный участок кучи вернуть обратно невозможно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
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
- - Nikitoc   Сергей, спасибо Вам большое. Разжевано предельно п...   Mar 1 2012, 19:57
- - _Ivana   Со стеком имхо ничего не поможет справиться, кроме...   Mar 1 2012, 20:00
|- - toweroff   Цитата(_Ivana @ Mar 2 2012, 00:00) Со сте...   Mar 1 2012, 20:03
- - _Ivana   Как интересно-то! Лично я бы стал пользоватьс...   Mar 1 2012, 20:17
|- - XVR   Цитата(_Ivana @ Mar 2 2012, 00:17) Если ф...   Mar 2 2012, 08:40
- - 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 Текстовая версия Сейчас: 19th July 2025 - 13:21
Рейтинг@Mail.ru


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