Imcomplete class type delete(不完整类类型的删除)
来源:互联网 发布:淘宝店铺的模板好卖吗 编辑:程序博客网 时间:2024/05/17 05:10
当delete不完整类类型对象的时候,不会调用对象的析构函数,导致内存泄漏。所以要避免delete 不确定类型。
首先解释下不完整类类型Imcomplete class type:只见声明不见定义的类、结构体或是联合体;相对应的就是complete type,就是编译器可以确定的类型。
下面举例说明:
//delete_object.h class CObject; void delete_object(CObject* pObj); //p为imcomplete type //delete_object.cpp void delete_object(CObject* pObj) {delete pObj;} //CObject.h class CObject { //destructor ~CObject() { //destructor called. } } //main file #include "delete_object.h" #include "CObject.h" int main(int argc, char[] argv) { CObject* pObj = new CObject(); delete_object(pObj); }
这里的pObj对象在delete的时候就是不确定对象,编译器不知道它的类型,无法调用析构函数,最终导致内存泄漏。解决的最简单的方法,就是在delete_object.cpp文件中增加#include “CObject.h”语句即可。
我们这里要重点介绍的是boost库中的使用的方法,方法使用的非常巧妙。整理如下:
//utiles.h template<typename T> inline void checked_delete(T * x) { // intentionally complex - simplification causes regressions typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete x; } template<typename T> inline void checked_arraydelete(T * x) { // intentionally complex - simplification causes regressions typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete[] x; } template<typename T> struct checked_deleter { typedef void result_type; typedef T * argument_type; void operator()(T * p) const { checked_delete(p); } }; template<typename T> struct checked_arraydeleter { typedef void result_type; typedef T * argument_type; void operator()(T * p) const { checked_arraydelete(p); } };
//main file //#include "delete_object.h" #include "CObject.h" #include "utiles.h" int main(int argc, char[] argv) { CObject* pObj = new CObject(); //delete_object(pObj); checked_deleter<CObject>(p); }
既能在静态编译时监测出delete是否有问题,也可以安全的删除,不用再担心内存泄漏了!
- Imcomplete class type delete(不完整类类型的删除)
- invalid use of imcomplete type 'class QKeyEvent'
- 不完整类型incomplete type
- c++避免delete不完整类型 --checked_delete
- C语言的不完整类型(incomplete type)和前置声明
- warning C4150: 删除指向不完整“CBasexxx”类型的指针;没有调用析构函数
- warning C4150: 删除指向不完整“CClient”类型的指针;没有调用析构函数
- “不允许指针指向不完整的类类型”问题分析
- 不允许指针指向不完整的类类型
- VS2010提示“不允许指针指向不完整的类类型”
- “不允许指针指向不完整的类类型”问题
- 不允许指针指向不完整的类类型
- 获得泛型(generic class)参数类型T的实际类型(actual type)
- 不完整结构类型的定义
- [错误]不允许使用不完整的类型
- eclipse F3可以看到class的定义,但是编辑器里有叉叉,refers to type "", 类型不匹配
- Scala 类型: Type vs. Class(类型与类)
- 关于不完整类型:
- win7玩CF出现error initrenderer().shutting down最简单最轻松的解决办法
- 回家
- SMS短信PDU编码
- Android学习笔记之广播(2)
- iis安装出现“当前标识没有对“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files”的写访问权限”
- Imcomplete class type delete(不完整类类型的删除)
- vb函数功能列表
- vim配置成IDE
- linux下的C语言开发(进程等待)
- 米老师语录
- QT:多线程下载文件
- MFC基础知识综
- base-kennel-process
- 【網絡流】【NOI2006】最大獲利