(c++)在if语句中创建的堆对象在语句结束后会发生什么?



正如标题所示,我想知道在调用结束括号后,我在if语句/for循环/任何其他函数中创建的堆对象的可用性。作为一个极简主义的例子:

class Foo
{
private:
int Bar;
public:
Foo(int bar) : Bar(bar) {}
int GetBar()
{
return Bar;
}
};
int main()
{
if (true)
{
Foo* foo = new Foo(6);
}
foo.GetBar();
}

在本例中,我希望在if语句范围内创建的foo实例在右括号之后继续存在,因为我在堆上使用"new&quot创建了它。但是,我不能在右括号之后访问它,并且不能使用foo.GetBar()。我已经验证过,当我使用&;new&;时,不会在if语句的右括号上调用析构函数(而不是在堆栈上实例化它),但是我不能再获得引用了。这是否意味着我只是失去了对对象的引用,但它仍然在内存中,导致内存泄漏?是否有一种方法可以在右括号后保持引用?

提前感谢您的帮助。

new的内存不会被删除,除非您手动使用delete。但指针foo会在if之后被删除。为了避免内存泄漏,您需要始终拥有该指针。例如,您可以

int main()
{
Foo* foo;
if (true)
{
foo = new Foo(6);
}
foo->GetBar();
}

感谢fabian,他注意到foo是一个需要->而不是.的指针。

最新更新