auto_ptr是如何实现智能指针,主要思想在于将指针包装后存放在栈上,这样就能自动清除工作,这是内存栈的特点。
1 |
int a = 0; //a变量存放在栈上 |
哪auto_ptr是如何实现呢?
1.定义一个模板类auto_ptr,? 具体定义请转到这篇:auto_ptr智能指针头文件
2.这样atuo_ptr就是一个类型,
1 |
auto_ptr<int> p(new int(1)); //p变量存放在栈上 |
当p对象离开作用域后将自动调用p对象的析构函数。
1 |
~auto_ptr() { delete _M_ptr; } //auto_ptr中定义的析构函数 |
可以看到析构函数内调用了delete,这样就自动完内存的释放。
具体auto_ptr智能指针实现图示:
3.auto_ptr内实现操作符重载* 、->,这样在写代码时看起来就跟一般指针一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
element_type& operator*() const throw() { _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0); return *_M_ptr; } element_type* operator->() const throw() { _GLIBCXX_DEBUG_ASSERT(_M_ptr != 0); return _M_ptr; } |
1 2 3 4 5 6 |
A* pi = new A(); pi->set(); delete pi auto<A> api(new A()); api->set(); |
以上就是auto_ptr实现智能指针的方法,auto_ptr其时就是一个类类型,只是它可以将指针再包装一次。
如要了解auto_ptr智能指针运用,转到这篇:auto_ptr智能指针使用与局限性