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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Возвращение указателя на динамический массив
Сергей Борщ
сообщение Mar 1 2012, 20:10
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 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
_Ivana
сообщение Mar 1 2012, 20:17
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 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
toweroff
сообщение Mar 1 2012, 20:24
Сообщение #18


Гуру
******

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



То есть "в лоб" - (как уже упомянали) - освобождать там, где и выделили
и выделить байт гораздо накладнее, чем 1КБ sm.gif

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

снесем все, построим заново, голосуе за... sm.gif ------- ни в коем случае не прАпОгандО!!!
уничтожить можно, я так понимаю, область процесса
если это ОС, похреним сами себя
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 1 2012, 20:30
Сообщение #19


Местный
***

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



Ладно, уговорили: free_всё_кроме_заполненного_массива_ещё_нужных_указателей() sm.gif Тогда можно и не освобождать каждый раз по одной области, просто регулярно указывать какие области/переменные ещё нужны sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 1 2012, 20:55
Сообщение #20


Гуру
******

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



QUOTE (_Ivana @ Mar 1 2012, 22:30) *
просто регулярно указывать какие области/переменные ещё нужны sm.gif
А как их найти, такие области? В плюсах есть возможность реализовать "умные указатели", которые считают количество ссылок, и как только количество ссылок равно нулю - освобождают память. Но и их можно "обнануть", да и накладные расходы они добавляют. А в Си только медитирование над исходниками.


--------------------
На любой вопрос даю любой ответ
"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
toweroff
сообщение Mar 1 2012, 21:00
Сообщение #21


Гуру
******

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



Цитата(_Ivana @ Mar 2 2012, 00:30) *
Ладно, уговорили: free_всё_кроме_заполненного_массива_ещё_нужных_указателей() sm.gif Тогда можно и не освобождать каждый раз по одной области, просто регулярно указывать какие области/переменные ещё нужны sm.gif

тогда это -- свой собственный обработчик кучи rolleyes.gif
Go to the top of the page
 
+Quote Post
_Ivana
сообщение Mar 1 2012, 21:07
Сообщение #22


Местный
***

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



Это было на правах фантазии дилетанта sm.gif Убирать в квартире постоянно или перед приходом гостей...
Никто не мешает сделать эти функции в существующем менеджере памяти. Разумеется, решать что ещё нужно а что нет лучше оставить человеку. Может ему через 10000000 тактов понадобится тот выделенный когда-то кусок и он сделал это осознанно. Просто если он хочет - будет выделять/освобождать каждый кусочек отдельно. А если "забывчивый" - пусть помнит хотя бы (в отдельном месте, массиве нужных временных динамических переменных, самостоятельно) - то что ещё ему нужно sm.gif Просто очень уж грустно и безысходно звучал тезис о потерянном навсегда кусочке памяти, вот я и фантазирую как можно их восстанавливать.

Например, в своем пока единственном проекте на asm с использованием ОЗУ, я планирую расписывать на каждом шаге какие переменные мне нужны, а не какие можно освободить. Это хотя бы даст график требуемого объема ОЗУ от текущего шага задачи и позволит определить максимально нужный объем под "динамические" переменные.

Сообщение отредактировал _Ivana - Mar 1 2012, 21:13
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 2 2012, 01:34
Сообщение #23


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(xemul @ Mar 1 2012, 21:54) *
Я не про использование кучи - оно вполне естественно, - а про несвязанные явно выделение и освобождение памяти.
Мне больше по душе, когда "выделил - ... - освободил" очевидно (свернув промежуточные {} при необходимости). Мне и своего склероза памяти хватает sm.gif

Тогда alloca() вместо . sm.gif
Посерьезней:
чтобы не было фрагментации, надо писать свой обработчик, заточенный под работу с массивом указателей. Тогда доступ к объекту не напрямую, а через дескриптор - номер элемента массива. Номера у нас остаются неизменными, а указатели могут свободно измениться если автор затеет дефрагментацию средствами своего манагера склероза.
Естественно, это все возможно, если отбросить иллюзию того, что "кол-во выделяемых блоков может быть любым." sm.gif

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


Гуру
******

Группа: Свой
Сообщений: 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
_Ivana
сообщение Mar 2 2012, 15:00
Сообщение #25


Местный
***

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



XVR спасибо, очень интересно и познавательно!
Go to the top of the page
 
+Quote Post
Idle
сообщение Mar 3 2012, 13:41
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата
result = (WORD *)malloc(1);

вылезаешь за границу выделенного блока при записи, выделяешь 1 байт, надо 2 (жду две страницы, что это и так работает - работает sm.gif)

Цитата
result = (WORD *)malloc(sizeof(*result));


упд
и приведение типов здесь излишне
Цитата
result = malloc(sizeof(*result));




Сообщение отредактировал Idle - Mar 3 2012, 13:44
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:58
Рейтинг@Mail.ru


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