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

标签 c++ pointers memory-management dynamic-memory-allocation

我正在玩 C++ 指针。我将内存分配给一个指针,但之后我没有释放它。下次我运行程序时,指针驻留在同一地址上——为什么?操作系统不应该将该地址视为已占用从而产生内存泄漏吗?

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

最佳答案

一些误解...

  1. 表达式&a是变量的地址 a ,即指针的地址,类型为 pointer-to-pointer-to-int。 a 的值无关紧要本身,即不管是否初始化,它的地址都是一样的。你可能想做 cout << a << std::endl;

  2. 对于程序的每次运行,操作系统都会分配一个全新的地址空间,并在程序结束时释放它,因此即使您不释放内存,它也会在程序结束时被释放。而且即使程序没有完成,每个进程都有自己的地址空间,所以一个进程分配的内存不会影响另一个进程的内存。

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

无论如何,请记住在 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/

相关文章:

c++ - 赋值运算符和条件语句

C++ count_if 函数 - 无法推断模板

c++ - std::vector<Object> 保留方法是否需要 Object 类的复制构造函数?

c++ - 将 QWidgets 放置在指定的坐标?

C:访问全局变量或传递指向函数的指针哪个更快

pointers - 在 Pascal 中使用 Dispose

c - 让两个指针指向同一个内存块的正确方法

c - 将字符串数组的指针传递给 C 中的 toupper()

Swift 的内存管理

c++ - 在回调函数中删除对象