指针和内存泄漏
Pointers and 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;
}
您正在为 p 和 q 分配内存:
p=new int [5];
/* ... */
q=new int;
但是您只使用无效运算符释放 p,因为应该使用 delete[] 删除数组。您应该在某个时候使用以下方法释放 p 和 q:
delete[] p;
delete q;
请注意,由于使指针指向另一个指针的已分配缓冲区,因此可能必须检查哪个delete
运算符对应于哪个new
操作。
您应该在分配了new[]
的缓冲区上使用delete[]
,对分配new
的缓冲区使用delete
。
您确实有内存泄漏。
最简单的规则是:
计算程序中new
和new []
的数量,您应该分别具有完全相同的delete
和delete []
数量。
您的程序具有new []
和new
,但只有一个delete
因此您泄漏了通过new []
分配的内存。
临时解决方案:
您应该在new []
返回的完全相同的地址上呼叫delete []
最合适的解决方案:
切勿手动管理动态内存 您应该使用 RAII 和智能指针为您执行此操作,这是执行此操作的理想和最合适的C++方法。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存