2013-02-05 64 views
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进行检查。

谢谢。 :)

更新:

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

b = new A();

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

* 捂脸 *

回答

6

由于bx()阴影全局声明的声明;它是一个单独的变量。所以在你的代码中,全局的b从来没有被分配给,所以你有内存泄漏。

2

你可以操纵outter b这样:

::b; 

内部功能x(),你宣布一个新的b这表明b全球。如果您想在外部b上操作,您可以提供scope resolution notation ::

+0

这将删除全局b(NULL初始化),但不是您尝试删除的“b”变量。另见Angew的回答。 – SChepurin

+0

是的。我注意到我可以做到:: b = new A();太。感谢您的意见。 :) – Aruman

1

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

main()delete b尝试删除全局指针b(其中,是全球性的,被初始化为空指针值,所以delete荷兰国际集团它什么都不做)。

0

x内部的b与全球范围内的b不同。我不知道“手动”变量应该是什么,但C++(实际用途)是词汇范围的。所以一个新变量隐藏了一个更高范围级别的变量。

相关问题