1. 程式人生 > >C++模板——智慧指標類模板

C++模板——智慧指標類模板

本文參照於狄泰軟體學院——《C++深度剖析課程》

智慧指標的意義

  1. 現代C++開發庫中最重要的類模板之一
  2. C++中自動記憶體管理的主要手段
  3. 能夠在很大程度上避開記憶體相關的問題

因為智慧指標使用類的形式封裝成一個指標類。所以在不同平臺上可能有不同的實現方式。所以瞭解不同平臺中智慧指標的實現,對我們來說很有幫助。

STL中的指標指標

auto_ptr

  1. 生命週期結束時,銷燬指向的記憶體空間
  2. 不能指向堆陣列,只能指向堆物件(變數)
  3. 一片堆空間只屬於一個指標指標物件
  4. 多個智慧指標物件不能指向同一片堆空間

shared_ptr

  1. 帶有引用計數機制,支援多個指標物件指向同一片記憶體

weak_ptr

  1. 配合shared_ptrer 而引入的一種智慧指標

unique_ptr

  1. 一個智慧指標物件指向一片記憶體空間,不能拷貝構造和賦值

示例程式碼:auto_ptr使用初探

#include <iostream>
#include <string>
#include <memory>

using namespace std;

class Test
{
    string m_name;
public:
    Test(const char* name)
    {
        cout << "Hello, "
<< name << "." << endl; m_name = name; } void print() { cout << "I'm " << m_name << "." << endl; } ~Test() { cout << "Goodbye, " << m_name << "." << endl; } }; int main() { auto_ptr
<Test> pt(new Test("D.T.Software")); cout << "pt = " << pt.get() << endl; pt->print(); cout << endl; auto_ptr<Test> pt1(pt); cout << "pt = " << pt.get() << endl; cout << "pt1 = " << pt1.get() << endl; pt1->print(); return 0; }

輸出結果:
Hello, D.T.Software.
pt = 0x9df9008
I’m D.T.Software.

pt = 0
pt1 = 0x9df9008
I’m D.T.Software.
Goodbye, D.T.Software.

Qt中的智慧指標

QPointer

  1. 當其指向物件被銷燬時,它會被自動置空
  2. 析構時不會自動銷燬所指向物件

QSharedPointer

  1. 引用計數型智慧指標
  2. 可以被自由拷貝和賦值
  3. 當引用計數為0時才刪除指向的物件

QWeakPointer

QScopedArrayPoint

QSharedDataPointer

QExplicitilySharedDataPointer

示例程式碼:Qt中的智慧指標

#include <QPointer>
#include <QSharedPointer>
#include <QDebug>

class Test : public QObject
{
    QString m_name;
public:
    Test(const char* name)
    {
        qDebug() << "Hello, " << name << ".";

        m_name = name;
    }

    void print()
    {
        qDebug() << "I'm " << m_name << ".";
    }

    ~Test()
    {
        qDebug() << "Goodbye, " << m_name << ".";
    }
};

int main()
{
    QPointer<Test> pt(new Test("D.T.Software"));
    QPointer<Test> pt1(pt);
    QPointer<Test> pt2(pt);

    pt->print();
    pt1->print();
    pt2->print();

    delete pt;

    qDebug() << "pt = " << pt;
    qDebug() << "pt1 = " << pt;
    qDebug() << "pt2 = " << pt;

    qDebug() << endl;

    QSharedPointer<Test> spt(new Test("Delphi Tang"));
    QSharedPointer<Test> spt1(spt);
    QSharedPointer<Test> spt2(spt);

    spt->print();
    spt1->print();
    spt2->print();

    return 0;
}