我們之前在 C++ 的學(xué)習(xí)中學(xué)習(xí)了有關(guān)智能指針的知識。那么智能指針的意義是現(xiàn)代 C++ 開發(fā)庫中最重要的類模板之一;是 C++ 中自動內(nèi)存管理的主要手段,它能夠在很大程度上避開內(nèi)存相關(guān)的問題。在 STL 標(biāo)準(zhǔn)庫中的智能指針為 auto_ptr,它的特點(diǎn)是:1、生命周期結(jié)束時,銷毀指向的內(nèi)存空間;2、不能指向堆數(shù)組,只能指向堆對象(變量);3、一片堆空間只屬于一個智能指針對象;4、多個智能指針對象不能指向同一片堆空間。
創(chuàng)新互聯(lián)公司成立于2013年,先為余干等服務(wù)建站,余干等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為余干企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
下來我們就來使用下 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;
}我們定義了一個類 Test 用來說明問題。在 main 函數(shù)中先是用 auto_ptr 指針來創(chuàng)建了一個指向 Test 類的指針,經(jīng)過下面這個指針 pt1 的操作后,pt 指針會指向空了。我們來看看編譯結(jié)果

我們看到在經(jīng)過指針 pt1 指向 pt 操作之后,指針 pt 的值便為空了。而且我們也沒有 delete,它便會自動的去刪除指針,執(zhí)行了析構(gòu)函數(shù)。下來我們再來說說 STL 標(biāo)準(zhǔn)庫中的其它智能指針:a> shared_ptr,帶有引用計數(shù)機(jī)制,支持多個指針對象指向同一片內(nèi)存;b> weak_ptr,配合 shared_ptr 而引入的一種智能指針;c> unique_ptr,一個指針對象指向一片內(nèi)存空間,不能拷貝構(gòu)造和賦值。
下來我們再來看看 QT 中的智能指針:a> QPointer,當(dāng)其指向的對象被銷毀時,它會被自動置空,但是它析構(gòu)時不會自動銷毀所指向的對象;b> QSharedPointer,引用計數(shù)型智能指針,可以被自由地拷貝和賦值,當(dāng)引用計數(shù)為 0 時才刪除指向的對象。我們還是以 QT 中的代碼為例來進(jìn)行分析(跟 C++ 差不多)
#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() << endl;
qDebug() << "pt = " << pt;
qDebug() << "pt1 = " << pt1;
qDebug() << "pt2 = " << pt2;
QSharedPointer<Test> spt(new Test("David"));
QSharedPointer<Test> spt1(spt);
QSharedPointer<Test> spt2(spt);
spt->print();
spt1->print();
spt2->print();
return 0;
} 在 QT 中的輸出是用 QDebug,它里面的字符串是用 QString 表示。我們在 QPointer 類中是手動調(diào)用 delete 的,而在 QSharedPointer 并沒有去調(diào)用 delete。來看看編譯結(jié)果
我們看到已經(jīng)實現(xiàn)了。在刪除了 QPointer 類后,它的三個指針都指向為空了。這便有效的防止了內(nèi)存泄漏和野指針的操作了。那么我們介紹了這么多的智能指針后,我們再基于我們之前創(chuàng)建的智能指針,在它的基礎(chǔ)上自己再來實現(xiàn)一個智能指針類模板。
SmartPointer.h 源碼
#ifndef _SMARTPOINTER_H_
#define _SMARTPOINTER_H_
template
< typename T >
class SmartPointer
{
T* mp;
public:
SmartPointer(T* p = NULL)
{
mp = p;
}
SmartPointer(const SmartPointer<T>& obj)
{
mp = obj.mp;
const_cast<SmartPointer<T>&>(obj).mp = NULL;
}
SmartPointer<T>& operator = (const SmartPointer<T>& obj)
{
if( this != &obj )
{
delete mp;
mp = obj.mp;
const_cast<SmartPointer<T>&>(obj).mp = NULL;
}
return *this;
}
T* operator -> ()
{
return mp;
}
T& operator * ()
{
return *mp;
}
bool isNull()
{
return (mp == NULL);
}
T* get()
{
return mp;
}
~SmartPointer()
{
delete mp;
}
};
#endiftest.cpp 源碼
#include <iostream>
#include <string>
#include "SmartPointer.h"
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()
{
SmartPointer<Test> pt(new Test("D.T.Software"));
cout << "pt = " << pt.get() << endl;
pt->print();
cout << endl;
SmartPointer<Test> pt1(pt);
cout << "pt = " << pt.get() << endl;
cout << "pt1 = " << pt1.get() << endl;
pt1->print();
return 0;
}我們在 main 函數(shù)沒有改動,只是將 auto_ptr 指針改為我們自己實現(xiàn)的 SmartPointer 了,再來看看是不是和之前的效果是一樣的呢?

通過對智能指針類模板的學(xué)習(xí),總結(jié)如下:1、智能指針是 C++ 中自動內(nèi)存管理的主要手段;2、智能指針在各種平臺上都有不同的表現(xiàn)形式;3、智能指針能夠盡可能的避開內(nèi)存相關(guān)的問題;4、STL 和 Qt 中都提供了對智能指針的支持。
歡迎大家一起來學(xué)習(xí) C++ 語言,可以加我QQ:243343083。
當(dāng)前標(biāo)題:智能指針類模板(五十)
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article38/ppdssp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、定制網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)