C 學習筆記之智慧型指標

2021-06-29 05:09:22 字數 2523 閱讀 4829

眾所周知,c++中最讓程式設計師頭疼的就是關於記憶體的問題,其中不外乎以下幾點:

1. 緩衝區溢位

2. 野指標

3. 重複釋放記憶體

4. 不配對的new/delete

5. 記憶體洩露

其中大多數的問題都是對指標的不正確使用帶來的。為此c++標準庫中對原始指標做了一些封裝,比如auto_ptr,使得指標更容易使用,但是還是存在眾多不足。而在boost庫中,對原始指標做了更多的封裝,彌補了auto_ptr的不足,所以下面介紹的是boost庫中的幾個智慧型指標。

定義:類似於auto_ptr的智慧型指標,它包裝了new操作符在堆上分配的動態物件,能夠保證動態建立的物件在任何時候都可以被正確地刪除,只能在被宣告的作用域內使用。

用法

#include 

using

namespace boost;

scoped_ptr sp(new

string("text"));

與auto_ptr的區別:scoped_ptr的所有權更加嚴格,一旦scoped_ptr獲取了物件的管理權就不能轉讓出去了(因為拷貝建構函式和賦值操作符都被宣告為私有)。而auto_ptr的所有權可以轉讓,比如:

auto_ptr

ap(new

string("test");

scoped_ptr sp1(ap); // ap已經把所有權讓給sp1了。

scoped_ptr sp2 = sp1; // 編譯錯誤,sp1的所有權不能轉讓。

定義:類似於scoped_ptr,但它包裝了new操作符在堆上分配的動態陣列,為動態陣列提供了乙個**,保證可以正確地釋放記憶體。它也不能拷貝、賦值。只能在被宣告的作用域內使用。

用法

#include 

using

namespace boost;

scoped_array sa(new

int[100]);

不足

1. scoped_array過載了操作符,所有可以像陣列一樣用獲取索引處的值,但是它並沒有提供陣列範圍的檢查,超出索引會引發未定義的行為發生。

2. 不能動態增長,也沒有迭代器支援,不能搭配stl演算法。

建議:要使用陣列語意時,不推薦用scoped_array,而應該用vector,它支援動態增長,且有豐富的成員函式來操縱資料。

定義:shared_ptr是乙個最像指標的「智慧型指標」,它和scoped_ptr一樣,包裝了new操作符在堆上分配的動態物件,但它實現的是引用計數型的智慧型指標,可以被自由的拷貝和賦值,在任意的地方共享它。

用法

#include 

using

namespace boost;

shared_ptr

sp(new

int(10));

另類用法

1. 工廠函式,不需要呼叫new關鍵字

#include

shared_ptrsp = make_shared("make_shared");

shared_ptrspv = make_shared>(10,2);

2. 定製刪除器

shared_ptr(y *p, d d)用於在析構時呼叫d方法來操作p指標,即呼叫d(p)。比如,在釋放套接字時候,呼叫關閉套將字的方法:shared_ptr(socket,close);

3. 其他一切用到指標的設計模式

定義:類似於shared_ptr,但包裝了new操作符,同樣使用了引用計數。

用法

int *p = new

int[100];

shared_array sa1(p);

shared_array sa2 = sa1;

注意:shared_array過載的不提供陣列索引的範圍檢查。建議使用shared_ptr或std::vector。

定義:為了配合shared_ptr而引入的一種智慧型指標,它更像乙個助手,它不具備普通指標的行為它的最大作用在於協助shared_ptr工作。它沒有過載operator*和->,這是特意的,因為它不共享指標,不能操作資源。

用法

shared_ptr

sp(new

int(10));

weak_ptr wp(sp);

if ( !wp.expired() ) // 判斷wp觀察的物件是否失效

C 智慧型指標學習筆記

原文 摘錄智慧型指標 auto ptr,unique ptr,shared ptr,weak ptr 智慧型指標的作用是管理乙個指標,因為存在一下的情況 申請的空間再函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標是乙個類,當超出了類的例項物件的作用域時...

學習筆記之智慧型指標shared ptr

智慧型指標都定義在 memory 標頭檔案中 程式使用的三種記憶體 靜態記憶體 存放 區域性,全域性static變數,以及全域性變數 棧記憶體 存放 區域性非static變數,函式內部變數 堆記憶體 自由空間 動態分配的物件 記憶體池 shared ptr 允許多個指標指向同乙個物件 shared ...

C 之智慧型指標

本文發表於1999年10月份的c c users journal,17 10 1.為什麼稱它為 自動 指標?auto ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的 服務。可以把標準c auto ptr看作智慧型指標的ford...