我有这段代码:
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。
*的 捂脸 *
答案 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 ++是(出于所有实际目的)词法范围。因此,新变量会将变量隐藏在更高的范围级别。