關於C 智慧型指標

2021-07-08 19:50:27 字數 1225 閱讀 3883

普通指標到智慧型指標的轉換

int* iptr = new int(42);

shared_ptrp(iptr);

智慧型指標到普通指標的轉換

int* pi = p.get();

注意的地方:那就是不要將智慧型指標與普通指標混用。如果專案允許,堅持使用智慧型指標,避免原生指標。

智慧型指標與普通指標需要特別特別特別的小心翼翼,比如以下的情況。

1. 普通指標到智慧型指標的問題

void f(shared_ptrptr) //增加引用計數

//銷毀ptr,減少引用計數

我們有如下的**:

int* iptr = new int(42);

f(shared_ptr(iptr));

int value = *iptr; // error! iptr指標指向的內容已經被釋放

因為在這兒,你將普通指標賦予給了乙個臨時的智慧型指標,當呼叫f函式完畢後,此臨時智慧型指標的生命週期結束,然後減少引用計數,歸為0,於是,記憶體釋放!

而這兒的更改方法是一直使用智慧型指標:

auto p = make_shared(42); // 初始化的引用計數為1

f(p); // 拷貝後增加為2,銷毀ptr減少1,然後變為1

int value = *p; //引用計數為1

2. 智慧型指標到普通指標的問題

auto p = make_shared(42);

int* iptr = p.get();

int value = *p; // error! 記憶體已經被釋放

p與iptr指向了相同的記憶體,然而通過get方法後,將記憶體管理權轉移給了普通指標。iptr傳遞給裡面程式塊的臨時智慧型指標後,引用計數為1,隨後出了作用域,減少為0,釋放記憶體。

額外的注意點:轉換

在c++11中,極力推崇完全替代原生指標。而這裡面,原生指標使用到了static_cast,dynamic_cast, const_cast的操作,需要用static_pointer_cast, dynamic_pointer_cast, const_pointer_cast對應操作,而並非使用原來的dynamic_cast等。

關於智慧型指標

讀 c stragegies and tacitics 的時候看到了一段很nb的 是關於智慧型指標的 程式稍作修改,以便在編譯器上執行 1 include 2using namespace std 34 class string ptr 9string operator const 10operat...

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 ...