我正在在线课上学习C ++,目前正在讨论指针和内存泄漏。
在课程中被告知当函数体结束时,所有局部变量都被销毁(与它们被声明的顺序相反)。
我试图理解的是这段代码是否会泄漏内存:
void function()
{
TestClass *p = new TestClass();
}
看起来确实如此,但我不确定为什么指针" p"没有被解除引用它的堆地址,并且一旦函数范围退出就会删除数据。
答案 0 :(得分:4)
肯定会泄漏内存。 当函数体结束时,所有局部变量被销毁表示在堆栈中创建的变量,而不是堆。如果在堆中分配内存,则必须在完成后释放它。
另一件事是关于 dereference 的概念是错误的。 取消引用表示使用指针指向的对象,而不释放指针的内存,称为释放
答案 1 :(得分:1)
指针本身将在堆栈中分配时被销毁,但p
指向的数据将泄漏。如果你写
TestClass tc;
TestClass *p = &tc;
然后所有对象都将在堆栈中创建并销毁,但使用new
强制从堆中使用内存。您必须使用delete
来释放它。
答案 2 :(得分:0)
new
用于为堆中的C ++类对象分配内存,在分配内存后调用对象的构造函数。
必须使用delete
运算符来释放使用new运算符分配的内存,否则会发生内存泄漏。
delete *p;