含有指针成员的对象的内存的开辟和释放需要注意的问题
2017-03-01 19:01
375 查看
最近在遇到一个问题,在一个类定义中,有三个的类成员是CxImage的图像指针,存储图像数据,因为每次读取图像的时候都需要开辟一个CxImage对象的内存,我在类的构造函数中为每个CxImage指针new了一个CxImage的内存,在构造函数中进行了释放。但是这样遇到一个问题,有时候,当这个类中的图像指针指向其他的图像时,或者是在调用图像读取函数(函数中开辟了内存返回了一个CxImage对象指针),这个时候就会存在内存泄漏,同时在析构函数中内存的释放也出现了问题。内存泄漏也许短时间内看不出来,但是长时间运行有时候会出问题。
解决办法:
1、在类的构造函数中,只是将指针置位NULL,不要为指针开辟内存,当需要使用的时候再开辟内存。这样避免了,在构造函数中开辟了内存,当指针指向其他数据时,造成内存泄漏的情况。eg:
2、在类的析构函数中,先判断指针成员是不是NULL,如果不是NULL,则释放其内存,不要直接delete释放。避免了内存释放出错。
3、每次在需要该指针成员的时候,先是将判断该指针成员是不是NULL,如果不是,则先释放内存,同时置为NULL,再为其开辟一个内存;如果是,直接开辟内存即可。这样避免了内存的泄漏。
解决办法:
1、在类的构造函数中,只是将指针置位NULL,不要为指针开辟内存,当需要使用的时候再开辟内存。这样避免了,在构造函数中开辟了内存,当指针指向其他数据时,造成内存泄漏的情况。eg:
Class Wnd { //.... CxImage* pImg; //..... } Wnd::Wnd() { pImg = NULL; }
2、在类的析构函数中,先判断指针成员是不是NULL,如果不是NULL,则释放其内存,不要直接delete释放。避免了内存释放出错。
Wnd::~Wnd() { if (pImg!=NULL) { delete pImg; pImg = NULL; } }
3、每次在需要该指针成员的时候,先是将判断该指针成员是不是NULL,如果不是,则先释放内存,同时置为NULL,再为其开辟一个内存;如果是,直接开辟内存即可。这样避免了内存的泄漏。
void main() { //.... Wnd wnd0; //... //... if(wnd0.pImg!=NULL) { delete wnd0.pImg; wnd0.pImg = NULL; } wnd0.pImg = new CxImage; //.... }总结:这样的做法可以最大程度上降低内存泄漏和内存错误释放的可能性。
相关文章推荐
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- 关于含有指针成员的类的对象之间赋值指针的问题。
- 指针使用时需要注意的问题
- 【100题】含有指针成员的类的拷贝问题~~
- PHP5 foreach对象数组需要注意的问题
- 『EXP2』关于在函数内部分配内存时需要注意的问题
- C++中的静态对象需要注意的几个问题
- C++指针及内存申请时应该注意问题
- C++中 没有数据成员的类的对象所占的内存空间大小问题
- 基类指针释放子类对象造成内存泄露
- C++中遍历容器对象时需要注意的问题
- 使用驱动直写内存时,关于类型需要注意的问题!
- c++类的指针成员指向的内存的释放
- 关于对 实体封装的对象 进行数据库操作时需要注意的问题
- [海康开发笔记]将内存片段格式化为C#类对象时需要注意对象的字段顺序
- JAVA别名问题----JAVA程序需要注意的对象引用
- 如果一个类内有指针引用的成员时应该注意的问题
- 使用Atl 创建Com对象需要注意的问题