c++給程式人員提供很多的權力,自然也就要完成很多的任務。最典型的就是c++的記憶體沒有自動**機制,所以要求程式設計師每次new&delete,不匹配則容易造成記憶體洩漏。
因此c++引入智慧型指標,是raii(利用的就是c++構造的物件最終會被銷毀的原則。raii的做法是使用乙個物件,在其構造時獲取對應的資源,在物件生命期內控制對資源的訪問,使之始終保持有效,最後在物件析構的時候,釋放構造時獲取的資源。)的一種應用,可用於動態資源管理,資源即物件的管理策略。標頭檔案為中std命名空間中定義,
只允許基礎指標的乙個所有者。可以移到新所有者,但不會複製或共享,
獨佔式擁有或嚴格擁有概念。
std::unique_ptrp(
newstring
("unique"))
;std::unique_ptr q;
q=p;
//此時試圖複製p物件,出錯,**
****
***q=
move
(p);
//此時通過移動將p物件的所有權交給q
unique_ptr還是比較簡單的,它多出了異常機制,這是普通指標所無法達到的。在想操作獨佔式物件時,讓程式設計師更清楚地知道自己在幹什麼事情,而不是像普通指標一樣,憑記憶來操作。
如同其名,share式擁有。多個智慧型指標指向相同的物件,該物件和其相關的資源會在最後乙個引用被銷毀的時候釋放。那麼就需要計數來知道有多少個智慧型指標在共享這個物件。
操作函式:
ues_count:返回引用計數的個數
unique:返回是否是獨佔所有權,use_count為1的時候
swap:交換兩個shared_ptr物件
reset:放棄內部物件的所有權或擁有物件的變更,會使引用計數減少
get:返回內部物件(指標)
//shared_ptr的建立有兩種方法
shared_ptr<
int> p1=make_shared<
int>(1
);//根據傳遞引數呼叫動態物件的建構函式
shared_ptr<
int>p2(
newint(2
));//原生構造**
****
****
****
****
****
****
****
****
****
****
****
****
****
****
//總例子示範
intmain()
基於shared_ptr的乙個漏洞而出現的指標:shared_ptr已經解決了很多問題,但是當兩個物件相互使用乙個shared_ptr成員變數指向對方的時候,會出現迴圈引用的情況,此時計數會失效。
#include
#include
#include
using
namespace std;
class
parent
;class
children
;class
parent
public
: std::shared_ptr child;};
class
children
public
: std::shared_ptr parent;};
void
verify()
intmain()
我們在parent中,構造了乙個child的shared_ptr。在child中構造了乙個parent的。
這時候想釋放parent,但是child裡保留了parent的引用。先釋放child也不行。這就是迴圈引用現象。
這時候就weak_ptr出馬了,它不控制物件的生命週期,指向乙個shared_ptr管理的物件,只提供乙個訪問管理物件的手段。weak_ptr的引入不會增加計數,和shared_ptr之間可以相互轉化,shared_ptr可以賦值給它,它也可以通過呼叫lock函式來獲取shared_ptr.
class
parent
public
: std::shared_ptr child;};
class
children
public
: std::weak_ptr parent;
// 替換成「弱引用」};
可以看到,析構成功。
操作函式:
weak_ptr 沒有過載*和->但可以使用 lock 獲得乙個可用的 shared_ptr 物件. 注意, weak_ptr 在使用前需要檢查合法性.
expired 用於檢測所管理的物件是否已經釋放, 如果已經釋放, 返回 true; 否則返回 false.
lock 用於獲取所管理的物件的強引用(shared_ptr). 如果 expired 為 true, 返回乙個空的 shared_ptr; 否則返回乙個 shared_ptr, 其內部物件指向與 weak_ptr 相同.
use_count 返回與 shared_ptr 共享的物件的引用計數.
reset 將 weak_ptr 置空.
weak_ptr 支援拷貝或賦值, 但不會影響對應的 shared_ptr 內部物件的計數.
具體的使用還是要到場景中來才有意義,智慧型指標是乙個好東西,但用不用,怎麼用都是設計者要思考的東西。
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...