代码1- int main(){
- //裸指针,手动开辟,需要自己释放,如果忘记了或者因为
- //程序逻辑导致p没有释放,那么就会导致内存泄漏
- int *p=new int(10);
- if(***){
- retur -1;
- }
- delete p;
- return 0;
- }
复制代码 有没有什么办法帮我们管理指针,确保资源释放?
智能指针
利用栈上的对象出作用域时自动析构的特征,来做到资源的自动释放
问题:是否可以在堆上创建裸指针?语法上没有问题,但是我们正式希望
栈上对象出作用域能自动析构的特征来达到自动管理指针的目的,如果
将智能指针创建在堆上,那又和原来的裸指针使用遇到的问题是一样的了
需要手动delete
代码2- #include <iostream>
- using namespace std;
- template<typename T>
- class MySmartPtr1 {
- public:
- MySmartPtr1(T * ptr=nullptr) : _mptr(ptr) { }
- ~MySmartPtr1() {
- delete _mptr;
- _mptr = nullptr;
- }
- T & operator*() { return *_mptr; }//返回的 是 & , 需要修改值
- T * operator->() { return _mptr; }
- private:
- T * _mptr;
- };
- int main() {
- MySmartPtr1<int> ptr(new int(10));
- *ptr= 200;
- return 0;
- }
复制代码 代码2的问题- int main() {
- MySmartPtr1<int> ptr(new int(10));
-
- //使用ptr 拷贝构造ptr2,默认的拷贝构造方式是值拷贝,所以底层
- //_mptr指针 指向的是同一块内存,那么ptr2 和ptr析构的时候就会有问题了,两次析构同一片内存
- MySmartPtr1<int> ptr2(ptr);
- *mptr = 200;
- return 0;
- }
复制代码 如何解决呢?
1:不带引用计数的智能指针
auto_ptr C++库提供
C++11 新标准
scoped_ptr
unique_ptr
代码 关于 auto_ptr
[code]int main() { auto_ptr ptr1(new int(100)); auto_ptr ptr2(ptr1); *ptr2 = 200; cout_mptr = _rval._mptr; this->_pRef = _rval._pRef; this->_pRef->addCount(); } //赋值重载 MySmartPtr2 & operator=(const MySmartPtr2 & _rval) { if (this == &_rval) { retur *this; } else { this->_pRef->deleltCount(); int currentCount = this->_pRef->refCount(); if (currentCount == 0) { delete this->_mptr;//销毁指向的资源 this->_mptr = nullptr; delete _pRef; _rPef = nullptr; } this->_pRef = _rval._pRef; this->_mptr = _rval._mptr; this->_pRef->addCount(); return *this; } } ~MySmartPtr2() { this->_pRef->deleltCount(); int currentCount = this->_pRef->refCount(); if (currentCount == 0) { delete this->_mptr;//销毁指向的资源 this->_mptr = nullptr; delete _pRef; _pRef = nullptr; } } int getRefCount() { return this->_pRef->refCount(); }private: T * _mptr; RefCount * _pRef;};int main() { MySmartPtr2 ms1(new int(100)) ; { MySmartPtr2 ms2(ms1); cout |