指针和内存泄漏

时间:2012-03-14 02:50:12

标签: c++ pointers memory-leaks

以下程序有什么问题吗?我是否必须删除指针,以便我没有内存泄漏?

请帮忙。

#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;
}

2 个答案:

答案 0 :(得分:3)

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

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

但是你只使用无效的运算符释放p,因为应该使用delete []删除数组。你应该在某些时候使用:

释放p和q
delete[] p;
delete q;

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

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

答案 1 :(得分:2)

你确实有内存泄漏 最简单的做法是:

计算new&amp;的数量您的计划中new [],您应该分别拥有deletedelete []的完全相同的数量。

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

临时解决方案:
您应该在delete []

返回的完全相同的地址上呼叫new []

最合适的解决方案:
您永远不应该手动管理动态内存您应该使用 RAIISmart pointers 为您执行此操作,这是理想的,也是最合适的C ++方式。< / p>