为什么没有释放这个全局堆对象
Why this global heap object not freed?
我有这个代码:
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=新A();
然后在main()上删除b可以正确删除全局b。
*facepalm*
因为x()
内部的b
声明遮蔽了全局声明;它是一个单独的变量。因此,在您的代码中,全局b
从未分配给,因此存在内存泄漏。
您可以通过以下方式操作b
:
::b;
在函数x()
中,您声明了一个新的b
,它在global中显示b
。如果您想在b
之外进行操作,可以提供scope resolution notation ::
。
在函数x()
中,您声明了一个局部变量b
。该变量与全局变量b
无关。
main()
中的delete b
尝试删除全局指针b
(其为全局指针,被初始化为空指针值,因此delete
对其执行任何操作)。
x
内部的b
与全局范围内的b
不同。我不知道"手动"变量应该是什么,但C++(出于所有实际目的)在词汇范围内。因此,一个新的变量会在更高的作用域级别隐藏一个变量。
相关文章:
- 类的全局对象和静态成员
- 内存清理程序报告全局对象构造中未初始化值的使用
- 涉及全局对象的循环依赖C++
- C++本地/全局对象的初始化
- 何时调用全局对象的构造函数?
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- C++全局对象丢失值
- std::atexit 从全局对象的构造函数调用时的排序
- 如果 LTO 中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?
- 从全局对象构造函数停止监视器计时器
- 全局引用全局对象
- 是否保证在销毁所有线程本地存储对象后销毁全局对象
- 销毁全局对象
- 如何在线程之间共享全局对象
- 在QT GUI中创建一个全局对象
- 使用全局对象时崩溃,但使用本地对象时不会崩溃
- C 全局对象变量内存释放
- 如何在嵌入式V8中重置全局对象
- 如何创建可供src/code和lib/libraries访问的全局对象
- 强制构造全局对象