自动内存分配如何在C ++中实际工作?

时间:2009-10-23 11:58:57

标签: c++ memory memory-management

在C ++中,假设没有优化,以下两个程序最终会使用相同的内存分配机器代码吗?

int main()
{     
    int i;
    int *p;
}

int main()
{
    int *p = new int;
    delete p;
}

5 个答案:

答案 0 :(得分:23)

答案 1 :(得分:18)

不,没有优化......

int main() 
{      
    int i; 
    int *p; 
}

几乎什么都没做 - 只是调整堆栈指针的几条指令,但是

int main() 
{ 
    int *p = new int; 
    delete p; 
}

在堆上分配一块内存然后释放它,这是一大堆工作(我在这里很认真 - 堆分配不是一个简单的操作)。

答案 2 :(得分:6)

    int i;
    int *p;

^在堆栈上分配一个整数和一个整数指针

int *p = new int;
delete p;

^堆栈上一个整数指针的分配和堆上整数大小的块

编辑:

Stack segment和Heap segment之间的差异

alt text
(来源:maxi-pedia.com

void another_function(){
   int var1_in_other_function;   /* Stack- main-y-sr-another_function-var1_in_other_function */
   int var2_in_other_function;/* Stack- main-y-sr-another_function-var1_in_other_function-var2_in_other_function */
}
int main() {                     /* Stack- main */
   int y;                        /* Stack- main-y */
   char str;                     /* Stack- main-y-sr */
   another_function();           /*Stack- main-y-sr-another_function*/
   return 1 ;                    /* Stack- main-y-sr */ //stack will be empty after this statement                        
}

每当任何程序开始执行时,它会将所有变量存储在名为堆栈段的特殊存储器内存位置。例如,在C / C ++的情况下,第一个被调用的函数是main。所以它将首先放在堆栈上。 main中的任何变量都将在程序执行时置于堆栈中。现在main是第一个被调用的函数,它将是最后一个返回任何值的函数(或者将从堆栈中弹出)。

现在,当您使用new动态分配内存时,会使用另一个称为堆段的特殊内存位置。即使堆指针上存在实际数据也位于堆栈上。

答案 3 :(得分:2)

听起来你不知道堆栈和堆。你的第一个例子是在堆栈上分配一些内存,一旦超出范围就会被删除。使用malloc / new获取的堆上的内存将保持不变,直到您使用free / delete删除它。

答案 4 :(得分:2)

在第一个程序中,您的变量都驻留在堆栈中。你没有分配任何动态内存。 'p'只是坐在堆栈上,如果你取消引用它,你会得到垃圾。在第二个程序中,您实际上是在堆上创建一个整数值。在这种情况下,'p'实际上指向一些有效的内存。你实际上可以取消引用p并将其设置为安全有意义的东西:

*p = 5;

这在第二个程序(删除前)中有效,而不是第一个。希望有所帮助。