为什么没有释放这个全局堆对象

Why this global heap object not freed?

本文关键字:全局 对象 释放 为什么      更新时间:2023-10-16

我有这个代码:

class A {
    public:
            int x;
};
A *b;
void x() {
    A a;
    A *b = new A();
//  delete b; // works. free b.
}
int main() {
    x();
    delete b; //not. why ?
    return 0;
}

为什么b只能在x()内部释放?不是main()?我认为b是一个手动变量,不受范围限制。用valgrind检查。

谢谢。:)

更新:

现在我想起来了。我可以使用全局b与:

b=新A();

然后在main()上删除b可以正确删除全局b。

*facepalm*

因为x()内部的b声明遮蔽了全局声明;它是一个单独的变量。因此,在您的代码中,全局b从未分配给,因此存在内存泄漏。

您可以通过以下方式操作b

 ::b;

在函数x()中,您声明了一个新的b,它在global中显示b。如果您想在b之外进行操作,可以提供scope resolution notation ::

在函数x()中,您声明了一个局部变量b。该变量与全局变量b无关。

main()中的delete b尝试删除全局指针b(其为全局指针,被初始化为空指针值,因此delete对其执行任何操作)。

x内部的b与全局范围内的b不同。我不知道"手动"变量应该是什么,但C++(出于所有实际目的)在词汇范围内。因此,一个新的变量会在更高的作用域级别隐藏一个变量。