unique ptr使用總結

2021-09-09 08:07:40 字數 2366 閱讀 9834

#include
std::unique_ptrpname };
auto pname = std::make_unique(「hello」);//c++14 support make_unique
可以用乙個unique_ptr初始化另外乙個unique_ptr嗎?

不可以,但是可以進行所有權轉移

vector可以裝unique_ptr嗎?

可以,但是unique_ptr不可拷貝,把已有的乙個unique_ptr裝進vector需要使用 std::move()

方式一

auto up_name = std::make_unique(「hello」);

std::unique_ptrup_new_name;

方式二

auto up_name = std::make_unique(「hello」);

std::unique_ptrup_new_name = std::move(up_name);

struct b 

virtual ~b() = default;

};struct d : public b

~d()

void bar() override

};std::unique_ptrp = std::make_unique();

std::vector v; // unique_ptr 能儲存於容器

v.push_back(std::make_unique());

v.push_back(std::move(p));

v.emplace_back(new d);

size_t len;

std::unique_ptrpnums ;

for (size_t i {}; ishared_ptr不具備這個功能,如果要支援,需要自己實現刪除器

因為unique_ptr不能被copy,因此傳參盡量使用引用型別

void func1(unique_ptr&up)

unique_ptr func1(int a)

當智慧型指標析構時,

unique_ptr

物件所指向的物件也會被析構。呼叫

reset()

函式可以析構它所指向的物件,

unique_ptr

物件中的原生指標會被替換為空指標

auto pname = std::make_unique(「hello」);

pname.reset() // release memory for string obj

可以將新物件的位址傳給

reset()

函式,這樣舊物件就會被析構

pname.reset(new std::string);
直接給智慧型指標物件賦值為空指標也會呼叫析構函式

pname = nullptr;
unique_ptr

可以隱式地轉換為布林值。如果乙個物件包含乙個空指標,將會被轉換為

false

否則轉換為

true,

因此可以用

if來檢查

auto up_name = std::make_unique(「hello」);

if(up_name)

std::cout<<「the name is 」<<*up_name, func};

// my_deletermyd;

// unique_ptr> dn_ptr , myd};

unique_ptr> dn_ptr , func};

cout<< *dn_ptr《智慧型指標都是 值語意,要麼是棧上物件,或者是其他物件的直接資料成員,或者是標準庫容器的元素,幾乎不會出現下面的用法

shared_ptr* = new shared_ptr(new foo)

•不要將其他的

unique_ptr

所指向的乙個物件的位址值傳給

reset()

或者去生成乙個新的

unique_ptr

物件,這種**可能會通過編譯,但是肯定會讓程式崩潰

•不能像對原生指標那樣,對智慧型指標進行一些自減和自增操作

•智慧型指標只能用來儲存堆上分配的記憶體的位址

int main(int argc, char** ar**) ;

cout<< *dn_ptr《儲存了棧上物件,能取值,但是會

crash

,因為記憶體二次釋放

unique ptr的相關使用

unique ptr由c 11中引入,用於替代不安全的auto ptr。unique ptr是一種定義在 memory 中的只能指標。它持有對物件的獨有權 這意味著,記憶體資源所有權可以轉移到另外乙個unique ptr,並且原始的unique ptr不再擁有次資源。實際使用中,建議將物件限制為由乙...

unique ptr的使用和陷阱

與shared ptr不同,unique ptr沒有定義類似make shared的操作,因此只可以使用new來分配記憶體,並且由於unique ptr不可拷貝和賦值,初始化unique ptr必須使用直接初始化的方式。unique ptr up1 new int okay,直接初始化 unique...

unique ptr的使用和陷阱

與shared ptr不同,unique ptr沒有定義類似make shared的操作,因此只可以使用new來分配記憶體,並且由於unique ptr不可拷貝和賦值,初始化unique ptr必須使用直接初始化的方式。unique ptrup1 new int okay,直接初始化 unique ...