|
Возвращение указателя на динамический массив |
|
|
|
Mar 1 2012, 20:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Mar 1 2012, 20:17
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Как интересно-то!  Лично я бы стал пользоваться менеджером памяти только если мне нужно в проекте последовательно создавать/уничтожать определенное количество разноформатных данных. Если формат динамических переменных условно одинаковый (или в течение работы программы отличается незначительно), то проще было бы использовать заранее нарезанные статические куски определенных типов, только использовать их для разных целей на каждом этапе. ЗЫ но конечно на непредсказуемых вещах типа компьютера без динамического выделения никак  Цитата поскольку result перестал существовать после выхода из этой функции - выделенный участок кучи вернуть обратно невозможно. Если бы я писал менеджер памяти, я бы предусмотрел функцию free_all() которая освобождает всю кучу. Вызывать её в редкие моменты когда там нет нужных переменных - и все потерянные куски возвратятся  Или я слишком оптимистичен и пустой куча не бывает никогда?
Сообщение отредактировал _Ivana - Mar 1 2012, 20:20
|
|
|
|
|
Mar 1 2012, 20:24
|

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

|
То есть "в лоб" - (как уже упомянали) - освобождать там, где и выделили и выделить байт гораздо накладнее, чем 1КБ  Цитата(_Ivana @ Mar 2 2012, 00:17)  Если бы я писал менеджер памяти, я бы предусмотрел функцию free_all() которая освобождает всю кучу. Вызывать её в редкие моменты когда там нет нужных переменных - и все потерянные куски возвратятся  Или я слишком оптимистичен и пустой куча не бывает никогда? снесем все, построим заново, голосуе за...  ------- ни в коем случае не прАпОгандО!!! уничтожить можно, я так понимаю, область процесса если это ОС, похреним сами себя
|
|
|
|
|
Mar 1 2012, 21:07
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Это было на правах фантазии дилетанта  Убирать в квартире постоянно или перед приходом гостей... Никто не мешает сделать эти функции в существующем менеджере памяти. Разумеется, решать что ещё нужно а что нет лучше оставить человеку. Может ему через 10000000 тактов понадобится тот выделенный когда-то кусок и он сделал это осознанно. Просто если он хочет - будет выделять/освобождать каждый кусочек отдельно. А если "забывчивый" - пусть помнит хотя бы (в отдельном месте, массиве нужных временных динамических переменных, самостоятельно) - то что ещё ему нужно  Просто очень уж грустно и безысходно звучал тезис о потерянном навсегда кусочке памяти, вот я и фантазирую как можно их восстанавливать. Например, в своем пока единственном проекте на asm с использованием ОЗУ, я планирую расписывать на каждом шаге какие переменные мне нужны, а не какие можно освободить. Это хотя бы даст график требуемого объема ОЗУ от текущего шага задачи и позволит определить максимально нужный объем под "динамические" переменные.
Сообщение отредактировал _Ivana - Mar 1 2012, 21:13
|
|
|
|
|
Mar 2 2012, 01:34
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(xemul @ Mar 1 2012, 21:54)  Я не про использование кучи - оно вполне естественно, - а про несвязанные явно выделение и освобождение памяти. Мне больше по душе, когда "выделил - ... - освободил" очевидно (свернув промежуточные {} при необходимости). Мне и своего склероза памяти хватает  Тогда alloca() вместо .  Посерьезней: чтобы не было фрагментации, надо писать свой обработчик, заточенный под работу с массивом указателей. Тогда доступ к объекту не напрямую, а через дескриптор - номер элемента массива. Номера у нас остаются неизменными, а указатели могут свободно измениться если автор затеет дефрагментацию средствами своего манагера склероза. Естественно, это все возможно, если отбросить иллюзию того, что "кол-во выделяемых блоков может быть любым."
Сообщение отредактировал _Pasha - Mar 2 2012, 01:35
|
|
|
|
|
Mar 3 2012, 13:41
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата result = (WORD *)malloc(1); вылезаешь за границу выделенного блока при записи, выделяешь 1 байт, надо 2 (жду две страницы, что это и так работает - работает  ) Цитата result = (WORD *)malloc(sizeof(*result)); упди приведение типов здесь излишне Цитата result = malloc(sizeof(*result));
Сообщение отредактировал Idle - Mar 3 2012, 13:44
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|