美文网首页
27_再论智能指针

27_再论智能指针

作者: 编程半岛 | 来源:发表于2018-07-08 18:30 被阅读6次

关键词:Pointer类的实现、重构SmartPointer

思考:使用智能指针(Smart Pointer)替换单链表(LinkList)中的原生指针是否可行?
由于智能指针在一片堆空间中最多只能有一个指针标识,而在LinkList中一个node可能需要多个指针表示,违背了智能指针的设计原则,因此不能用智能指针代替LinkList中的原生指针,需要设计一种新的指针类——SharedPointer

0. 新的设计方案

类图如下所示:


智能指针类
  • Pointer是智能指针的抽象父类(模板类)
    纯虚析构函数virtual ~Pointer() = 0
    重载operator->()
    重载operator*()

Pointer.h

#ifndef POINTER_H
#define POINTER_H

#include "Object.h"

namespace DTLib
{

template < typename T >
class Pointer : public Object
{
protected:
    T* m_pointer;
public:
    Pointer(T* p = NULL);
    T* operator-> ();
    T* operator* ();
    bool isNull();
    T* get();
};

Pointer<T>::Pointer(T* p = NULL)
{
    m_pointer = p;
}

T* Pointer<T>::operator-> ()
{
    return m_pointer;
}

T* Pointer<T>::operator* ()
{
    return *m_pointer;
}

bool Pointer<T>::isNull()
{
    return (m_pointer == NULL);
}

T* Pointer<T>::get()
{
    return m_pointer;
}

}

#endif // POINTER_H

重构后的SmartPointer.h

#ifndef SMARTPOINTER_H
#define SMARTPOINTER_H

#include "Pointer.h"

namespace DTLib
{
template < typename T >
class SmartPointer : public Pointer<T>
{
public:
    SmartPointer(T* p = NULL);
    SmartPointer(const SmartPointer<T>& obj);
    SmartPointer<T>& operator= (const SmartPointer<T>& obj);
    ~SmartPointer();
};

template < typename T >
SmartPointer<T>::SmartPointer(T* p) : Pointer<T>(p)
{

}

/* 拷贝构造函数:一片堆空间最多由智能一个指针标识,防止堆空间重复释放 */
template < typename T >
SmartPointer<T>::SmartPointer(const SmartPointer<T>& obj)
{
    this->m_pointer = obj.m_pointer;           // 将当前对象的指针指向obj对象指针

    /* 为了将一片堆空间最多由一个智能指针标识,需要将obj.m_pointer置空 */
    const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
}

/* 重载赋值操作符:一片堆空间最多由智能一个指针标识,防止堆空间重复释放 */
template < typename T >
SmartPointer<T>& SmartPointer<T>::operator= (const SmartPointer<T>& obj)
{
    if( this != &obj )  // 排除自赋值
    {
        /* 先创建一个指针指向*this中的pointer,
           然后将obj中的pointer赋值给*this的pointer,
           然后将obj中的pointer置为NULL,
           删除临时指针p(保证类异常安全)*/
        T* p = this->m_pointer;
        this->m_pointer = obj.m_pointer;
        const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;

        delete p;
    }

    return *this;
}

template < typename T>
SmartPointer<T>::~SmartPointer()
{
    delete this->m_pointer;
}

}

#endif // SMARTPOINTER_H

声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

相关文章

  • 27_再论智能指针

    关键词:Pointer类的实现、重构SmartPointer类 思考:使用智能指针(Smart Pointer)替...

  • 28_再论智能指针(下)

    关键词:SharedPointer类的实现 0. SharedPointer类图 2. SharedPointe...

  • 再探指针(智能指针)

    指针是一个指向内存中存储某个变量的地址。如果你对指针进行解引用操作,就能访问指针指向的变量。指针实际上是一个基础变...

  • 目录

    智能指针(1) 智能指针(2) 智能指针(3) 智能指针之使用 容器 - vector(1) 容器 - vecto...

  • 智能指针到Android引用计数

    智能指针 LightRefBase RefBaseStrongPointerWeakPointer 智能指针 这是...

  • C++面试重点再梳理

    智能指针 请讲一下智能指针原理,并实现一个简单的智能指针 智能指针其实不是一个指针。它是一个用来帮助我们管理指针的...

  • C++研发工程师笔试题/面试题(1-10)

    1. (1) 简述智能指针的原理;(2)c++中常用的智能指针有哪些?(3)实现一个简单的智能指针。 简述智能指针...

  • 2022.7.7(晴)

    放假第三天。检查。27_

  • 第十六章 string类和标准模板库(2)智能指针模板类

    (二)智能指针模板类 智能指针是行为类似指针的类对象,但这种对象还有其他便于管理内存的功能。 1.使用智能指针 (...

  • Rust for cpp devs - 智能指针

    与 cpp 类似,Rust 也有智能指针。Rust 中的智能指针与引用最大的不同是,智能指针 own 内存,而引用...

网友评论

      本文标题:27_再论智能指针

      本文链接:https://www.haomeiwen.com/subject/bxuiaxtx.html