重载new和delete方法实现C++内存安全
2012-10-22 03:25
274 查看
C++使用new关键字创建的对象,被分配到堆内存空间,然后得到对象地址,当程序复杂庞大时容易发生访问地址bug或内存泄露bug。为了避免内存泄露并在调试程序时找到内存泄露的bug,可以重载new和delete函数,确保程序的内存安全。
new和delete关键字都可以作为operator来重载。重载的new函数规定一个参数size_t表示需要在堆空间上分配的内存大小,可以认为等于sizeof得到的大小,这个数值由系统创建对象时传递来。一般的实现方法就是:
重载的delete函数规定一个参数void*表示要删除的对象地址,一般的实现方法就是:
在这两个函数里加入一些调试代码,监视对象的创建和删除的次数是否对应,就能比较容易发现哪些对象发生了内存泄露,这样就容易找到bug位置。在函数堆栈上按值创建的对象则无需关心,而且在函数堆栈上创建和删除对象也不会调用new和delete函数。这个方法仅限于C++面向对象编程,如果程序分配内存是直接使用C语言运行库函数(malloc()之类),则需要其它方法,比如CrtDbg里的调试函数。
new和delete关键字都可以作为operator来重载。重载的new函数规定一个参数size_t表示需要在堆空间上分配的内存大小,可以认为等于sizeof得到的大小,这个数值由系统创建对象时传递来。一般的实现方法就是:
#include <stdlib.h> void* operator new(const size_t type_size) { return malloc(type_size); }
重载的delete函数规定一个参数void*表示要删除的对象地址,一般的实现方法就是:
#include <stdlib.h> void operator delete(void* obj_ptr) { free(obj_ptr); }
在这两个函数里加入一些调试代码,监视对象的创建和删除的次数是否对应,就能比较容易发现哪些对象发生了内存泄露,这样就容易找到bug位置。在函数堆栈上按值创建的对象则无需关心,而且在函数堆栈上创建和删除对象也不会调用new和delete函数。这个方法仅限于C++面向对象编程,如果程序分配内存是直接使用C语言运行库函数(malloc()之类),则需要其它方法,比如CrtDbg里的调试函数。
相关文章推荐
- 重载new和delete方法实现C++内存安全
- C++动态内存:(二)重载new和delete
- 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
- 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
- c++ 重载new和delete实现内存管理
- [C++再学习系列] 深入new/delete:Operator new的全局重载
- C++ 动态分配内存的(new)之撤销内存的(delete)
- C++中malloc/free与new/delete的区别及内存分配失败错误处理
- 通过重载new和delete实现简单的对象池
- c++中new和delete的使用方法(转载)
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- 如何检测内存泄漏——重载new和delete
- c++中new和delete的使用方法
- c++中new和delete的使用方法
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
- c++内存泄露之重载new运算符
- c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义
- 重载new和delete,处理内存溢出
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- c++中new和delete的使用方法