码迷,mamicode.com
首页 > 编程语言 > 详细

c++之智能指针

时间:2020-04-07 22:25:07      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:namespace   例子   new   test   null   opera   class   标准库   本质   

智能指针简介

为了防止内存的释放问题,c++臭名昭著的内存泄露等,相当于把当前申请的内存托管给指针管理类,通过这个类间接访问实际类

本质

本质就是把当前申请的内存传到一个类中,让这个类存储指针,通过重载的方式间接访问这个存储的指针类
可以这么说,有了智能指针的出现,在c++的代码中就不应该再频繁的出现裸指针
简易shared_pointer实现:

#ifndef SMARTPOINTPER_H_
#define SMARTPOINTPER_H_
#include "Log.h"
namespace DTLib {
template <typename T>
class SmartPointer {
public:
    SmartPointer(T* pointer = nullptr) {
        LOG_FC();
        if(pointer == nullptr) {
            LOG_E("pointer == NULL");
            return;
        }
        m_pointer = pointer;
    }
    SmartPointer(const SmartPointer& pointer) {
        if(pointer.m_pointer != nullptr) {
            m_pointer = pointer.m_pointer;
            const_cast< SmartPointer<T>& >(pointer).m_pointer = nullptr;
        }
        else {
            LOG_E("pointer == NULL");
            return;
        }
    }
    SmartPointer& operator = (const SmartPointer& pointer) {
        if(this == &pointer) {
            return *this;
        }
        if(pointer.m_pointer != nullptr) {
            if(m_pointer != nullptr) {
                LOG_FC();
                delete m_pointer;
                m_pointer = nullptr;
            }
            m_pointer = pointer.m_pointer;
            const_cast< SmartPointer<T>& >(pointer).m_pointer = nullptr;
        }
        else {
            LOG_E("pointer == NULL");
        }
        return *this;
    }

    T* operator -> () {
       return  m_pointer;
    }
    T& operator * () {
       return *m_pointer;
    }
    T* Get() {
        if(m_pointer == nullptr) {
            LOG_E("pointer == NULL");
            return nullptr;
        }
        return m_pointer;
    }
    bool IsNull() {
        return m_pointer == nullptr;
    }

    ~SmartPointer() {
        if(!IsNull()) {
            LOG_FC();
            delete m_pointer;
            m_pointer = nullptr;
        }
    }

private:
    T* m_pointer;
};
} // namespace
#endif // SMARTPOINT_H

常用智能指针简介
1.unique_ptr
作为一种独占所有权的ptr,使用get()获得当前包含的指针
本质是让智能指针类的拷贝构造和赋值操作符重载失效
例子

#include <iostream>
#include <memory>
#include "Log.h"
class Test {
public:
    void print() {
        std::cout << "print()" << std::endl;
    }
};

int main()
{
    std::unique_ptr<Test> a(new Test());
    a->print(); //调用指向的内存函数
    //std::unique_ptr<Test> b(a); //无法编译通过
    std::unique_ptr<Test> b(a.get());//可以编译通过,破坏了独立性
    b->print(); //调用指向的内存函数

    std::shared_ptr<Test> shared(new Test());
    shared->print(); //调用指向的内存函数
    std::shared_ptr<Test> shared_b(shared); // 编译通过
    shared_b->print(); //调用指向的内存函数

    std::weak_ptr<Test> wake(shared);
    std::shared_ptr<Test> wake_one = wake.lock();
    wake_one->print();
    std::shared_ptr<Test> wake_two = wake.lock();
    wake_two->print();

    return 0;
}

个人觉得对于标准库而言会用就好,懂得原理足够

c++之智能指针

标签:namespace   例子   new   test   null   opera   class   标准库   本质   

原文地址:https://www.cnblogs.com/zero-waring/p/12656295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!