cpp的智能指针

cpp的智能指针

智能指针是利用了构造函数分配内存,利用析构函数自动掉的特性释放内存

智能指针可以解决一些内存不释放的问题

智能指针实现的例子

template <typename T>
class MySmartPointer {
private:
    T *m_pointer;

public:
    MySmartPointer(T *pdata):m_pointer(pdata){}
    ~MySmartPointer(){delete m_pointer;};

    T& operator*()const{
        return *(m_pointer);
    }

    T* operator->()const{
        return m_pointer;
    }

};

智能指针的类型

管理内存资源是智能指针与众不同的地方。

简单的实现可能会导致性能问题,最快的实现又可能不适合项目

智能指针的分类

深度复制
写时复制
引用计数
引用链接
破坏性复制

深度复制

在实现深度复制的智能指针中,每个智能指针都保存一个它管理的对象的完整副本。
当智能指针被复制时,也将复制它指向的对象。当智能指针离开作用域时,将释放它指向的内存。

缺点是效率不高。可以避免切片

class Animal{
public:
    string name;
    Animal(){name = "animal";};
    virtual ~Animal(){}
    virtual void talk(){
        cout << "Animal talk" << endl;
    }
};

class Dog:public Animal{
public:
    Dog(){name = "dog";}
    ~Dog(){}
    virtual void talk(){
        cout << "Dog talk" << endl;
    }
};

class Cat:public Animal{
public:
    Cat(){name = "cat";}
    ~Cat(){}
    virtual void talk(){
        cout << "Cat talk" << endl;
    }
};

void makeAnimalTalk(Animal manimal){
    cout << manimal.name << endl;
    manimal.talk();
}

void tsmartPoint(){
    cout << "smart pointer" << endl;
    //深度切片
    Cat mcat;
    makeAnimalTalk(mcat);
    Dog mdog;
    makeAnimalTalk(mdog);

}

以上代码都是输出 animal talk.

使用深度切片可以避免这个问题

写时复制机制

视图对深度复制的性能进行优化,它共享指针,知道首次写入对象。

引用计数智能指针

记录对象的用户的数量的机制,当计数降低到0后,便释放对象。

引用链接智能指针

引用链接智能指针不主动维护,只要知道计数为0便自动释放。

破坏性复制

在智能指针被复制时,将所有权交给目标指针,并重置原来的指针。

cpp标准库提供的auto_ptr

基于破坏性复制指针

//标准库提供的破坏性指针

class SomeClass{

public:
    SomeClass(){cout << "SomeClass constructed" << endl;}
    ~SomeClass(){cout << "SomeClass destructed" << endl;}
    void saySome(){cout << "SomeClass:hello boy" << endl;;}
};

void usePointer(auto_ptr<SomeClass> ap){
    ap->saySome();
}

void usePointer(){
    cout << "usePointer" << endl;
    auto_ptr<SomeClass> ap1(new SomeClass());
    usePointer(ap1);
    ap1->saySome();
}

常用的智能指针库

boost

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值