Изменения

Перейти к: навигация, поиск

Выполнение программы

1435 байт добавлено, 20:35, 11 июля 2011
Нет описания правки
Так как <tex>g</tex> задана конвенция вызова <tex>\_\_stdcall</tex>, после ее вызова вершина стека не будет сдвигаться. Однако, <tex>f</tex> задана конвенция вызова <tex>\_\_cdecl</tex>, поэтому аргумент не удалится со стека при вызове <tex>ret</tex>, и при следующем запросе адреса возврата будет выдан адрес <tex>239</tex>, скорее всего, не являющийся валидным.
==Размещение локальных переменных==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
===Архив===
Рассмотрим процесс выделения памяти в куче на примере простой программы:
 
[[Файл:vmmap_before.png|right|thumb|200px|Память не выделена]]
[[Файл:vmmap_after.png||right|thumb|200px|Выделена память под массив]]
[[Файл:vmmap_delete.png||right|thumb|200px|Память освобождена]]
 
int main()
{
int *a = new int [1000000];
delete [] a;
return 0;
}
 
До выполнения
int *a = new int [1000000];
куча в адресном пространстве программы занимает <tex>1152kB</tex>, а после выполнения команды - <tex>5060kB</tex>. Значит, память была выделена именно в куче, и объем выделенной памяти равен <tex>3908kB</tex>, что почти в точности соответствует объему массива <tex>int</tex> из <tex>1000000</tex> элементов при выделении <tex>4B</tex> на элемент.
 
После выполнения
delete [] a;
размер кучи снова равен <tex>1152kB</tex>, как и до выделение памяти под массив.
 
 
{{TODO|t=Показать в адресном пространстве ран-тайм, библиотеки ядра}}
97
правок

Навигация