0

我有这个代码:

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检查。

谢谢你。:)

更新:

现在我想起来了。我可以使用 global b :

b = 新的 A();

那么main()上的delete b就可以正确的删除全局b了。

*掌心*

4

4 回答 4

6

因为binside的声明x() 遮蔽了全局声明;这是一个单独的变量。所以在你的代码中,全局b永远不会分配给,所以你有内存泄漏。

于 2013-02-05T12:22:57.433 回答
2

你可以用这种方式操纵外部b

 ::b;

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

于 2013-02-05T12:23:10.163 回答
1

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

delete binmain()试图删除全局指针b(它是全局的,被初始化为空指针值,所以delete它什么都不做)。

于 2013-02-05T12:24:03.410 回答
0

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

于 2013-02-05T12:24:33.577 回答