Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Выделение памяти


Автор: rukudias 17.5.2012, 04:00
Привет Всем!
Читая одну интересную книгу наткнулся на следующее определения
Цитата

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

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

мож ктонить привести пример для двух послед способов и если первый способ интерпритирован мной не привильно то и для него тоже.
Спасибо.

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

вызвав malloca

Автор: bsa 17.5.2012, 15:31
rukudias, к сожалению, я тоже слабо себе представляю, как можно с помощью обычного new выделить память в области стека текущего фрейма функции. А вот все остальное вполне возможно. Например, со стандартным контейнером (например, list) нет никаких проблем: делаешь статический объект std::list<std::vector<char> > и при каждом вызове new возвращаешь адрес данных нового вектора.

Автор: 500mhz 17.5.2012, 17:08
Цитата

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

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

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

вот только нет никаких гарантий, что они не перезапишутся сразу после выхода из процедуры, например, при смене контекста ядром.

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

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


Автор: 500mhz 18.5.2012, 18:01
Господа я же не говорю что данными в стеке после выхода нужно пользоваться.

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

Автор: baldina 21.5.2012, 09:52
почему нет, это же внутреннее дело operator new()
http://codepad.org/vwor2opV
http://liveworkspace.org/code/54212f595885ded2bb100ec85d05c660

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

Добавлено через 11 минут и 59 секунд
но обычным объектам alloca() не мешает
http://codepad.org/dxPgNIFO

Автор: 500mhz 21.5.2012, 14:50
GlobalAlloc рулит )))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)