以下程序有什么问题吗?我是否必须删除指针,以便我没有内存泄漏?
请帮忙。
#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;
}
答案 0 :(得分:3)
您正在为p和q分配内存:
p=new int [5];
/* ... */
q=new int;
但是你只使用无效的运算符释放p,因为应该使用delete []删除数组。你应该在某些时候使用:
释放p和qdelete[] p;
delete q;
请注意,由于您的指针指向另一个指针的已分配缓冲区,因此您可能必须检查哪个delete
运算符对应于哪个new
操作。
您应该在分配了delete[]
和new[]
的缓冲区上使用delete
,缓冲区分配有new
。
答案 1 :(得分:2)
你确实有内存泄漏 最简单的做法是:
计算new
&amp;的数量您的计划中new []
,您应该分别拥有delete
和delete []
的完全相同的数量。
您的程序有一个new []
和一个new
但只有一个delete
,因此您泄漏了通过new []
分配的内存。
临时解决方案:
您应该在delete []
new []
最合适的解决方案:
您永远不应该手动管理动态内存您应该使用 RAII和Smart pointers 为您执行此操作,这是理想的,也是最合适的C ++方式。< / p>