重载全局new/delete具体实现内存检测

来源:互联网 发布:哈尔滨铁路局 知乎 编辑:程序博客网 时间:2024/06/17 15:13
按照上面转载的文章的思路,只是小小的实现了一下。还有很多不足,等到有想法的时候再修改。
#include <iostream>#include <stdlib.h>using namespace std;template <typename T>class smartPtr{public:smartPtr(T *ptr):_ptr(ptr),useCountPtr(new int(1)){     }smartPtr(const smartPtr<T> & org):_ptr(org.getPtr()),useCountPtr(org.getUseCountPtr()){    ++(*useCountPtr);}smartPtr<T> & operator=(const smartPtr& org){/* code */_ptr=org.getPtr();useCountPtr=org.getUseCountPtr();++(*useCountPtr);           return *this;}smartPtr<T>* operator=(const smartPtr<T> *org){/* code */_ptr=org->getPtr();useCountPtr=org->getUseCountPtr();++(*useCountPtr);                return this;}void setValue(T date){      *_ptr=date;}T getValue() const{    return *_ptr;}T *getPtr() const{    return _ptr;}int *getUseCountPtr() const {return useCountPtr;}~smartPtr(){cout<<"distructor usecount is "<<(*useCountPtr)-1<<endl;if (--(*useCountPtr)==0){/* code */delete _ptr;_ptr=NULL;cout<<"ptr delete safely!!!";}}private:T* _ptr;int *useCountPtr;/* data */};int main(){   int* num=new int(10);   smartPtr<int> *pp=new smartPtr<int>(num);   smartPtr<int> *pp1=new smartPtr<int>(*pp);   smartPtr<int> ss=*pp;   smartPtr<int> *pp2=pp;   cout<<pp->getValue()<<endl;   delete pp;   delete pp1;   delete pp2;}

输出结果:

this cpp has memory leak!!!!
D:\code\go1\mesh.cpp line :96 new ptr not delete!!!
will delete later...
D:\code\go1\mesh.cpp line :96  deleted.
D:\code\go1\mesh.cpp line :98 new ptr not delete!!!
will delete later...
D:\code\go1\mesh.cpp line :98  deleted.

0 0