智慧型指標與動態記憶體

2021-08-20 02:39:19 字數 2537 閱讀 4820

4. unique_ptr

5. weak_ptr

6.迴圈引用

7.智慧型指標的設計和實現

p400

在c++中,動態記憶體通過一對運算子完成:

shared_ptr:允許多個指標指向同乙個物件

unique_ptr:獨佔所指向的物件

weak_ptr:是一種弱引用,指向 shared_ptr 所管理的物件

以上三種都定義在memory標頭檔案中;

c++11 在記憶體管理上同樣做了很多改進,std::make_shared 就是其中之一。它是和 std::shared_ptr 共同出現的,std::shared_ptr 是一種智慧型指標,它能夠記錄多少個 shared_ptr 共同指向乙個物件,能夠消除顯示的呼叫 delete,當引用計數變為0的時候就會將物件自動刪除。

但還不夠,因為使用 std::shared_ptr 仍然需要使用 new來呼叫,這使得**出現了某種程度上的不對稱。因此就需要另一種手段(工廠模式)來解決這個問題。

std::make_shared 就能夠用來消除顯示的使用 new,所以std::make_shared 會分配建立傳入引數中的物件,並返回這個物件型別的std::shared_ptr指標。例如

#include

#include

void

foo(std::shared_ptr<

int> i)

intmain()

理解智慧型指標需要從下面三個層次:

#include

#include

intmain()

}

《c++primer》p417

#include

#include

intmain()

//超過uptr的作用域,記憶體釋放

}

#include

#include

intmain()

}//delete memory

}

正確的做法

#include

#include

class

child

;class

parent

;class

parent

void

dosomething()

}~parent()

};class

child

void

dosomething()

}~child()

};intmain()

std::cout << wpp.

use_count()

<< std::endl;

// 0

std::cout << wpc.

use_count()

<< std::endl;

// 0

return0;

}

下面是乙個簡單智慧型指標的demo。智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指標。每次建立類的新物件時,初始化指標並將引用計數置為1;當物件作為另一物件的副本而建立時,拷貝建構函式拷貝指標並增加與之相應的引用計數;對乙個物件進行賦值時,賦值操作符減少左運算元所指物件的引用計數(如果引用計數為減至0,則刪除物件),並增加右運算元所指物件的引用計數;呼叫析構函式時,建構函式減少引用計數(如果引用計數減至0,則刪除基礎物件)。智慧型指標就是模擬指標動作的類。所有的智慧型指標都會過載 -> 和 * 操作符。智慧型指標還有許多其他功能,比較有用的是自動銷毀。這主要是利用棧物件的有限作用域以及臨時物件(有限作用域實現)析構函式釋放記憶體。

複製**

#include

#include

template

<

typename t>

class

smartpointer

else

}smartpointer

(const smartpointer& ptr)}

smartpointer&

operator=(

const smartpointer& ptr)if(

this

->_ptr)

}this

->_ptr = ptr._ptr;

this

->_count = ptr._count;(*

this

->_count)++;

return

*this;}

t&operator*(

) t*

operator

->()

~smartpointer()

} size_t use_count()

};intmain()

//delete operator

}

動態記憶體與智慧型指標

動態記憶體與智慧型指標 靜態記憶體用來儲存區域性static物件 類static資料成員以及定義在任何函式之外的變數 全域性變數 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷毀。對於棧物件,僅在其定義的程式塊執行時才存在 static物件在使用之...

動態記憶體與智慧型指標

在c 中,動態記憶體的管理是通過一對運算子來完成的 new,在動態記憶體中為物件分配空間並返回乙個指向該物件的指標,我們可以選擇對物件進行初始化 delete,接受乙個動態物件指標,銷毀該物件並釋放與之關聯的記憶體。動態記憶體在使用時很容易出問題,有時會忘記釋放記憶體,造成記憶體洩露,有時在尚有指標...

動態記憶體與智慧型指標

我們先來看一些物件的生存期。全域性物件在程式啟動時分配,在程式結束時銷毀。區域性static物件在第一次使用前分配,在程式結束時銷毀。區域性自動物件,在進入其定義所在的程式塊兒時被建立,離開塊時銷毀。即,它們都是由編譯器自動建立與銷毀。而動態分配的物件的生存期與它們在 建立的無關,只有當顯式地被釋放...