我正在玩 C++ 指针。我将内存分配给一个指针,但之后我没有释放它。下次我运行程序时,指针驻留在同一地址上——为什么?操作系统不应该将该地址视为已占用从而产生内存泄漏吗?
int* a = new int[1]; //or (int*) malloc(1);
cout << &a << endl; //always 0x28fe98
最佳答案
一些误解...
表达式
&a
是变量的地址a
,即指针的地址,类型为 pointer-to-pointer-to-int。a
的值无关紧要本身,即不管是否初始化,它的地址都是一样的。你可能想做cout << a << std::endl;
对于程序的每次运行,操作系统都会分配一个全新的地址空间,并在程序结束时释放它,因此即使您不释放内存,它也会在程序结束时被释放。而且即使程序没有完成,每个进程都有自己的地址空间,所以一个进程分配的内存不会影响另一个进程的内存。
除非使用某种形式的虚拟空间随机化(出于安全目的),否则同一程序的多次运行产生或多或少相同的地址是很自然的。
无论如何,请记住在 C++ 中基本上有 3 种类型的内存:静态(全局变量)、自动(局部变量)和动态(新对象)。在您的示例中,a
(地址为 &a
)是自动的或静态的,从上下文中不清楚,但是 a
指向的整数(地址 a
)是动态的。您可能想把所有 3 个都玩一遍,看看它们有何不同。
一个特别有趣的实验是递归函数中局部变量的地址:
void rec(int x)
{
cout << x << ": " << &x << endl;
if ( x > 0)
rec(x - 1);
}
关于c++指针总是在同一个地址,即使没有被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698892/