<一>智能指针基础

王柳  金牌会员 | 2022-12-2 16:05:47 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 539|帖子 539|积分 1617

代码1
  1. int main(){  
  2.    //裸指针,手动开辟,需要自己释放,如果忘记了或者因为
  3.    //程序逻辑导致p没有释放,那么就会导致内存泄漏
  4.    int *p=new int(10);
  5.    if(***){
  6.      retur -1;
  7.    }
  8.    delete p;
  9.    return 0;
  10. }
复制代码
有没有什么办法帮我们管理指针,确保资源释放?
智能指针
利用栈上的对象出作用域时自动析构的特征,来做到资源的自动释放
问题:是否可以在堆上创建裸指针?语法上没有问题,但是我们正式希望
栈上对象出作用域能自动析构的特征来达到自动管理指针的目的,如果
将智能指针创建在堆上,那又和原来的裸指针使用遇到的问题是一样的了
需要手动delete
代码2
  1. #include <iostream>
  2. using namespace std;
  3. template<typename T>
  4. class MySmartPtr1 {
  5. public:
  6.      MySmartPtr1(T * ptr=nullptr) : _mptr(ptr) {  }
  7.          ~MySmartPtr1() {
  8.                  delete _mptr;
  9.                  _mptr = nullptr;
  10.          }
  11.          T & operator*() { return *_mptr; }//返回的 是 & , 需要修改值
  12.          T * operator->() { return _mptr; }
  13. private:
  14.         T * _mptr;
  15. };
  16. int main() {
  17.         MySmartPtr1<int> ptr(new int(10));
  18.         *ptr= 200;
  19.         return 0;
  20. }
复制代码
代码2的问题
  1. int main() {
  2.         MySmartPtr1<int> ptr(new int(10));
  3.       
  4.        //使用ptr 拷贝构造ptr2,默认的拷贝构造方式是值拷贝,所以底层
  5.        //_mptr指针 指向的是同一块内存,那么ptr2 和ptr析构的时候就会有问题了,两次析构同一片内存      
  6.         MySmartPtr1<int> ptr2(ptr);
  7.         *mptr = 200;
  8.         return 0;
  9. }
复制代码
如何解决呢?
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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表