0. 智能指針的意義
- 現(xiàn)代C++開發(fā)庫中最重要的類模板之一
- C++中自動內(nèi)存管理的主要手段
- 能夠在很大程度避開內(nèi)存相關(guān)的問題
1. STL中的智能指針:auto_ptr
- 生命周期結(jié)束時谣妻,銷毀指向的內(nèi)存空間
- 不能指向堆數(shù)組僧须,只能指向堆對象(變量)
- 一片堆空間只屬于一個智能指針對象
- 多個智能指針對象不能指向同一片堆空間
編程說明:auto_ptr使用
#include <iostream>
#include <string>
#include <memory>
using namespace std;
class Test
{
string m_name;
public:
Test(const char* name)
{
m_name = name;
cout << "Hello " << m_name << endl;
}
void print()
{
cout << "I am " << m_name << endl;
}
~Test()
{
cout << "Goodbey " << m_name << endl;
}
};
int main()
{
auto_ptr<Test> pt(new Test("Jacob"));
cout << "pt = " << pt.get() << endl;
pt->print();
cout << endl;
auto_ptr<Test> pt1(pt); // 指針的轉(zhuǎn)移
cout << "pt = " << pt.get() << endl;
cout << "pt1 = " << pt1.get() << endl;
pt1->print();
return 0;
}
輸出結(jié)果:
Hello Jacob
pt = 0x9c58008
I am Jacob
pt = 0
pt1 = 0x9c58008
I am Jacob
Goodbey Jacob
2.STL中的其它智能指針
-
shared_ptr
:帶有引用計(jì)數(shù)機(jī)制,支持多個指針對象指向同一片內(nèi)存 -
weak_ptr
:配合shared_ptr
而引入的一種智能指針 -
unique_ptr
:一個指針對象指向一片內(nèi)存,不能拷貝構(gòu)造和賦值
3. Qt中的智能指針
-
QPointer
:- 優(yōu)點(diǎn):當(dāng)其指向的對象被銷毀時矛绘,它(QPointer允許有多個)會被自動置空
- 缺點(diǎn):析構(gòu)時不會自動銷毀所指向的對象
-
QSharedPointer
:- 引用計(jì)數(shù)型智能指針
- 可以被自由地拷貝和賦值
- 當(dāng)引用計(jì)數(shù)為0時才刪除指向的對象