在下面的代码中,我将一个整数数组分配给指针多次 . 在每个调用中,指针的地址是相同的,至少在我运行它时 . 如果我不使用 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();
}
}
3 回答
您正在打印指针变量的地址,而不是分配区域的地址 . 试试看这个分配区域的地址:
如果您指针
delete
,那么您可以在每次调用中从new
获得相同的值 . 如果你没有delete
指针,那么你将永远不会得到相同的指针返回,因为该函数必须分配新的内存并且系统不能重用一些先前删除的内存 .你动态分配的内存保持分配给进程的其余部分,它不是"local",因为变量可以是本地的 . 如果你没有释放(通过使用
delete
)内存,那么你有内存泄漏 .函数返回时用于局部变量的内存由下一个函数调用和下一个函数的局部变量重用 .