Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти, обьясните плиз определения 
:(
    Опции темы
rukudias
Дата 17.5.2012, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 28.2.2007

Репутация: 0
Всего: 0



Привет Всем!
Читая одну интересную книгу наткнулся на следующее определения
Цитата

Широко распространено заблуждение что применение операторов new и delete подрарумевает необходимость работать с кучей(heap) или свободной памятью.
Вызов оператора new лишь означает что будет вызвана функуия operator new  и эта фукнция возратит указатель на некоторую область памяти. Стандартные глобальные operator new и delete действительно распределяют память из кучи но члены operator new и delete  могут делать все что угодно.Нет гораничений на то где будет выделенаобласть памяти.
-Она может поступить из спец кучи(HeapAlloc и др из win api ?)
-из статически выделенного блока (тут как бы ясно)
-из недр стандартного контейнера (как ?)
-или из блока локальной памяти  функции (как ? )

из книги "C++. Священные знания"

мож ктонить привести пример для двух послед способов и если первый способ интерпритирован мной не привильно то и для него тоже.
Спасибо.
PM MAIL   Вверх
bems
Дата 17.5.2012, 04:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(rukudias @  17.5.2012,  04:00 Найти цитируемый пост)
из блока локальной памяти  функции (как ? )

вызвав malloca


--------------------
Обижено школьников: 8
PM MAIL   Вверх
bsa
Дата 17.5.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



rukudias, к сожалению, я тоже слабо себе представляю, как можно с помощью обычного new выделить память в области стека текущего фрейма функции. А вот все остальное вполне возможно. Например, со стандартным контейнером (например, list) нет никаких проблем: делаешь статический объект std::list<std::vector<char> > и при каждом вызове new возвращаешь адрес данных нового вектора.
PM   Вверх
500mhz
Дата 17.5.2012, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Цитата

выделить память в области стека текущего фрейма функции

Там все просто, указатель стека сдвинули, вот вам и память выделили, обычно там все локальные переменные и структуры хранятся, соответственно после выхода из функции указатель стека на место возвращаеться и как бы все данные теряются (на самом деле не совсем так, пока они не перезаписаны то они есть).


--------------------

PM MAIL ICQ   Вверх
bsa
Дата 17.5.2012, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(500mhz @  17.5.2012,  18:08 Найти цитируемый пост)
(на самом деле не совсем так, пока они не перезаписаны то они есть)

вот только нет никаких гарантий, что они не перезапишутся сразу после выхода из процедуры, например, при смене контекста ядром.
PM   Вверх
volatile
Дата 17.5.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(500mhz @  17.5.2012,  17:08 Найти цитируемый пост)
после выхода из функции указатель стека на место возвращаеться и как бы все данные теряются (на самом деле не совсем так, пока они не перезаписаны то они есть). 

Такие фокусы, только для сумасшедших.  smile 
Достаточно одного прерывания в момент возврата, и вместо данных окажется полная хрень.


PM MAIL   Вверх
500mhz
Дата 18.5.2012, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



Господа я же не говорю что данными в стеке после выхода нужно пользоваться.


--------------------

PM MAIL ICQ   Вверх
math64
Дата 21.5.2012, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Есть функция alloca(size) - она выделит память на стеке, которой можно пользоваться до выхода из функции, вызвавшей её.
Но я не уверен, что её можно использовать в C++, если на стеке будут создаваться обычные объекты C++, имеющие конструктор и деструктор.

PM   Вверх
baldina
Дата 21.5.2012, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



почему нет, это же внутреннее дело operator new()
http://codepad.org/vwor2opV
http://liveworkspace.org/code/54212f595885...b100ec85d05c660
PM MAIL   Вверх
baldina
Дата 21.5.2012, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



это я глупость написал - alloca() внутри new(). после выхода из new стек очищается

Добавлено через 11 минут и 59 секунд
но обычным объектам alloca() не мешает
http://codepad.org/dxPgNIFO
PM MAIL   Вверх
500mhz
Дата 21.5.2012, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



GlobalAlloc рулит )))


--------------------

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0808 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.