在下面的代码中,我将一个整数数组分配给指针多次。在每个调用中,指针的地址是相同的,至少在我运行它时。如果我不使用delete [] y
,则该进程将被杀死而不会抛出任何异常。如果我添加该行,该过程将永远运行。
我的问题是,因为在两种情况下(使用或不使用delete
)指针的地址在函数的调用之间保持相同,这是否意味着内存中的相同空间被分配?如果是,为什么在一种情况下该过程停止而在另一种情况下不停止?
在一个更一般的问题中,函数返回时用于局部变量的内存会发生什么?常规变量和指针之间的内存管理策略是否不同?
#include<cstdio>
#include<iostream>
#include<exception>
#include<new>
using namespace std;
void foo();
int main()
{
while(true)
foo();
}
void foo()
{
try{
int *y=new int[1000];
printf("%X\n",&y);
// delete [] y;
}
catch(exception &exc){
cerr<< exc.what();
}
}
答案 0 :(得分:4)
您正在打印指针变量的地址,而不是已分配区域的地址。试试这个以查看分配区域的地址:
printf("%p\n", (void*)y);
答案 1 :(得分:1)
如果您delete
指针,则可能在每次通话中从new
获得相同的值。如果你没有delete
指针,那么你永远不会得到相同的指针返回,因为函数必须分配新的内存,系统不能重用一些以前删除的内存。
你动态分配的内存保持分配给进程的其余部分,它不是“本地”的,因为变量可以是本地的。如果你没有释放(通过使用delete
)内存,那么你就会有内存泄漏。
答案 2 :(得分:0)
函数返回时用于局部变量的内存由下一个函数调用和下一个函数的局部变量重用。