C++模板——智慧指標類模板
阿新 • • 發佈:2019-02-11
本文參照於狄泰軟體學院——《C++深度剖析課程》
智慧指標的意義
- 現代C++開發庫中最重要的類模板之一
- C++中自動記憶體管理的主要手段
- 能夠在很大程度上避開記憶體相關的問題
因為智慧指標使用類的形式封裝成一個指標類。所以在不同平臺上可能有不同的實現方式。所以瞭解不同平臺中智慧指標的實現,對我們來說很有幫助。
STL中的指標指標
auto_ptr
- 生命週期結束時,銷燬指向的記憶體空間
- 不能指向堆陣列,只能指向堆物件(變數)
- 一片堆空間只屬於一個指標指標物件
- 多個智慧指標物件不能指向同一片堆空間
shared_ptr
- 帶有引用計數機制,支援多個指標物件指向同一片記憶體
weak_ptr
- 配合shared_ptrer 而引入的一種智慧指標
unique_ptr
- 一個智慧指標物件指向一片記憶體空間,不能拷貝構造和賦值
示例程式碼: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
- 當其指向物件被銷燬時,它會被自動置空
- 析構時不會自動銷燬所指向物件
QSharedPointer
- 引用計數型智慧指標
- 可以被自由拷貝和賦值
- 當引用計數為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;
}