指针和内存泄漏

Pointers and memory leaks

本文关键字:泄漏 内存 指针      更新时间:2023-10-16

下面的程序有什么问题吗?我是否必须删除指针以免出现内存泄漏?

请帮忙。

#include<iostream>
using namespace std;
int main()
{
int x=2, y=3;
int *p,*q;
int **pp;
cout<<x<<","<<y<<endl;//x=2,y=3
p=&x;
q=&y;
cout<<*p<<","<<*q<<endl;//*p=2,*q=3
p=new int [5];
p[2]=9;
q=p+x;
p[0]=8;
cout<<*p<<","<<*q<<endl;//*p=8,*q=9
pp=&p;
cout<<pp[0][2]<<endl;//pp[0][2]=9
q=new int;
p=q;
*p=5;
*q=7;
cout<<*p<<","<<*q<<endl;//*p=7,*q=7
delete p;
p=NULL;
}

您正在为 p 和 q 分配内存:

p=new int [5];
/* ... */
q=new int;

但是您只使用无效运算符释放 p,因为应该使用 delete[] 删除数组。您应该在某个时候使用以下方法释放 p 和 q:

delete[] p;
delete q;

请注意,由于使指针指向另一个指针的已分配缓冲区,因此可能必须检查哪个delete运算符对应于哪个new操作。

您应该在分配了new[]的缓冲区上使用delete[],对分配new的缓冲区使用delete

您确实有内存泄漏。
最简单的规则是:

计算程序中newnew []的数量,您应该分别具有完全相同的deletedelete []数量。

您的程序具有new []new,但只有一个delete因此您泄漏了通过new []分配的内存。

临时解决方案:
您应该在new []返回的完全相同的地址上呼叫delete []

最合适的解决方案:
切勿手动管理动态内存 您应该使用 RAII 和智能指针为您执行此操作,这是执行此操作的理想和最合适的C++方法。