即使没有删除,c ++指针总是在同一个地址上

Pri*_*alj 1 c++ pointers memory-management dynamic-memory-allocation

我在玩C++指针.我将内存分配给指针,但之后我没有释放它.下次运行程序时,指针位于同一地址 - 为什么?OS不应该看到该地址被占用因此产生内存泄漏吗?

int* a = new int[1]; //or (int*) malloc(1);
cout << &a << endl; //always 0x28fe98
Run Code Online (Sandbox Code Playgroud)

rod*_*igo 8

一些误解......

  1. 表达式&a是变量a的地址,即指针的地址,指向指针指向int的类型.它a本身的价值无关紧要,也就是说它是否被初始化,它的地址是相同的.你可能想做cout << a << std::endl;

  2. 对于程序的每个运行的OS分配了一个全新的地址空间,在程序完成时将其释放,所以即使你不释放内存的程序完成时,它会被释放.即使程序没有完成,每个进程都有自己的地址空间,因此在一个进程中分配的内存不会影响另一个进程的内存.

  3. 除非使用某种形式的虚拟空间随机化(出于安全目的),否则同一程序的多次运行产生或多或少相同的地址是很自然的.

总之,请记住,在C++中,基本上有3种类型的存储器:静态(全局变量),自动(局部变量)和动态(new'ed对象).在您的示例中,a(带地址&a)是自动的或静态的,不能从上下文中清除,但a(地址a)指向的整数是动态的.您可能想要与它们中的所有3个一起玩,看看它们是如何不同的.

一个特别有趣的实验是递归函数中局部变量的地址:

void rec(int x)
{
    cout << x << ": " << &x << endl;
    if ( x > 0)
        rec(x - 1);
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ore 6

如果再次运行程序,则表示上一次运行已结束.这意味着操作系统回收了内存.内存泄漏并不意味着内存永远保留在您的应用程序中,即使它结束也是如此.操作系统比这更聪明.

  • 最重要的是,程序的每个实例都有自己的*虚拟*地址空间.假设程序的两个副本正在运行,则副本#1上的​​地址"0x28fe98"和副本号#2上的地址"0x28fe98"不是**相同的地址. (5认同)