标签:操作 调用 false cout using app 行操作 size 不能
auto_ptr包含于头文件 #include<memory> 其中<vector><string>这些库中也存有。auto_ptr 能够方便的管理单个堆内存对象,在你不用的时候自动帮你释放内存。
auto_ptr的设计目的:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int *p=new int(10); 6 if(*p>2) 7 return 0; 8 delete p; 9 p=NULL; 10 }
vc: template<class _Ty> class auto_ptr { public: typedef _Ty element_type; explicit auto_ptr(_Ty *_P = 0) _THROW0() : _Owns(_P != 0), _Ptr(_P) {} auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0() : _Owns(_Y._Owns), _Ptr(_Y.release()) {} auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0() {if (this != &_Y) {if (_Ptr != _Y.get()) {if (_Owns) delete _Ptr; _Owns = _Y._Owns; } else if (_Y._Owns) _Owns = true; _Ptr = _Y.release(); } return (*this); } ~auto_ptr() {if (_Owns) delete _Ptr; } _Ty& operator*() const _THROW0() {return (*get()); } _Ty *operator->() const _THROW0() {return (get()); } _Ty *get() const _THROW0() {return (_Ptr); } _Ty *release() const _THROW0() {((auto_ptr<_Ty> *)this)->_Owns = false; return (_Ptr); } private: bool _Owns; _Ty *_Ptr; };
解析代码:
#include <iostream> #include <vld.h> int main() { int *p=new int(10)//初始化指针 return 0; }
运行结果:
由于没有用delete释放内存空间,所以造成内存空间浪费了四个字节。
2.
#include<iostream> using namespace std; class Test { public: void fun() { cout << "Test::fun()" << endl; } }; template<class _Ty> class auto_ptr { public: explicit auto_ptr(_Ty *_P = 0) :_Owns(_P != 0), _Ptr(_P) {} auto_ptr(const auto_ptr<_Ty>&_Y):_Owns(_Y._Owns),_Ptr(_Y.release()){} auto_ptr<_Ty>&operator=(const auto_ptr<_Ty>&_Y)//赋值运算符重载 { if(this!=&_Y)//判断自身赋值给自身 { if (_Ptr != _Y._Ptr)//判断两指针是否指向同一内存 { if (_Owns) //判断该对象是否有拥有权 delete _Ptr; //释放成员指针指向的内存空间 _Owns = _Y._Owns; //修改该指针的拥有权 } else if (_Y._Owns) _Owns = true; _Ptr = _Y.release(); //修改_Y的拥有权,并将_Y的_Ptr赋值给该成员_Ptr从而使该对象具有_Y._Ptr指向空间的拥有权 } return (*this); } _Ty& operator*() { return *_Ptr; } _Ty* operator->() { return _Ptr; } _Ty*release()const { ((auto_ptr<_Ty>*)this)->_Owns = false; return (_Ptr); } ~auto_ptr() { if (_Owns) delete _Ptr; } private: bool _Owns;//拥有权 _Ty *_Ptr; }; int main() { int *p = new int(10); auto_ptr<int> pl(p); cout << *pl << endl; Test *pc = new Test; auto_ptr<Test> temp(pc); temp->fun(); auto_ptr<int>pal = pl; cout << *pal << endl; auto_ptr<int>pt; pt = pal; cout << *pal << endl; cout << *pt << endl; return 0; }
标签:操作 调用 false cout using app 行操作 size 不能
原文地址:https://www.cnblogs.com/ycw1024/p/10420777.html