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

时间:2013-02-05 12:21:19

标签: c++ heap

我有这段代码:

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()中释放?不是主()?我认为b是一个手动变量,而不是范围限制。 用valgrind检查。

谢谢。 :)

更新

现在我记得。我可以使用全局b:

b = new A();

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

*的 捂脸 *

4 个答案:

答案 0 :(得分:6)

因为b 内部的x()声明全局声明;它是一个单独的变量。因此,在您的代码中,永远不会分配全局b,因此您有内存泄漏。

答案 1 :(得分:2)

你可以用这种方式操纵b

 ::b;

在函数x()内,您声明了一个新的b,它在全局中显示b。如果您希望在scope resolution notation ::之外操作,则可以提供b

答案 2 :(得分:1)

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

delete b中的

main()尝试删除全局指针b(它是全局的,初始化为空指针值,因此delete它什么都不做)

答案 3 :(得分:0)

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