C/C++日常疑問(wèn):程序員不建議代碼中使用指針,這是為什么?
盡量避免在大多數(shù)代碼中使用指針實(shí)現(xiàn)。
使用現(xiàn)代C?++,您幾乎不需要傳遞指針,可以依賴引用,并且編譯器本身可以進(jìn)行優(yōu)化以避免不必要的復(fù)制和自動(dòng)轉(zhuǎn)移所有權(quán)。但不總是。

智能指針的用例仍然存在。如果必須動(dòng)態(tài)創(chuàng)建對(duì)象并將其返回到調(diào)用堆棧,則希望它們?cè)诔龇秶鷷r(shí)釋放自己。如果找不到確定的位置來(lái)刪除對(duì)象,或者無(wú)法確定要?jiǎng)h除該對(duì)象的對(duì)象,那么智能指針是一個(gè)很好的解決方案。
unique_ptr的一些優(yōu)點(diǎn)是:
您知道您的smart_ptr將持續(xù)存在,直到不再位于任何范圍內(nèi),并且沒(méi)有函數(shù)或類會(huì)意外地將其銷毀。
整個(gè)代碼路徑中指向的對(duì)象將只有一個(gè)銷毀。
unique_ptr并不是一個(gè)真正的指針,它的行為就像一個(gè)透明的指針,將調(diào)用轉(zhuǎn)發(fā)到它所連接的對(duì)象。它不能“懸掛”并且不能為空。
unique_ptr的開(kāi)銷幾乎與原始指針相同,即幾乎沒(méi)有。沒(méi)有使用原始指針的加速。
shared_ptr用于由多個(gè)線程,對(duì)象等共享(更震驚?。┑馁Y源。它們?cè)跁r(shí)間和內(nèi)存上的使用比unique_ptr昂貴,但是它們解決了在使用對(duì)象的函數(shù)結(jié)束時(shí)保持活動(dòng)對(duì)象的難題。他們?yōu)槲覀兲峁┝艘粋€(gè)參考計(jì)數(shù)器和原子訪問(wèn)。在垃圾回收語(yǔ)言中,引用計(jì)數(shù)由運(yùn)行時(shí)線程保留,但C?++?shared_ptr保留其引用計(jì)數(shù)。在大多數(shù)程序中,shared_ptr的用例少于unique_ptr。

如何避免使用智能指針泄漏:
通常,他們?yōu)槟瓿晒ぷ鳎袔准拢?/p>
1.創(chuàng)建對(duì)象后,立即將其分配給指針。
Object?*?myobject?=?new?Object(“?pi”,3.14159);
unique_ptr??op(myobject);
std?::?cout?<<?op->?getname()<<?std:endl;
2.?僅使用smart_pointer,不要再使用原始指針。
std?::?cout?<<?myobject->?getname()<<?std:endl;?//壞
//永遠(yuǎn)不要在原始指針上調(diào)用delete。
3.僅在unique_ptr內(nèi)部訪問(wèn)該對(duì)象以復(fù)制該對(duì)象。
您不能復(fù)制unique_ptr。如果需要復(fù)制對(duì)象,
則應(yīng)使用unique_ptr?::?get()和new一起將副本分配
給另一個(gè)unique_ptr。
unique_ptr??o2(*?op);?//簡(jiǎn)短,但錯(cuò)誤。
unique_ptr??o2(new?Object(*?op));?//?對(duì)
4.將unique_ptrs作為unique_ptrs傳遞給函數(shù),或者取消引用它們并將它們作為const引用傳遞。

5.如果函數(shù)必須擁有unique_ptr的所有權(quán),則將其移入函數(shù)。

6.?shared_ptr可以使用賦值()復(fù)制,a?=?b但不要將a重新分配給另一個(gè)shared_ptr,否則引用計(jì)數(shù)將減少。如果達(dá)到0,它將自行刪除。

7.不要嘗試從靜態(tài)分配的對(duì)象中創(chuàng)建unique_ptr或shared_ptr。編譯器可能會(huì)讓您在編譯時(shí)無(wú)法使用它,但是當(dāng)靜態(tài)分配的對(duì)象自行銷毀并且智能指針隨后嘗試刪除它時(shí),它將導(dǎo)致內(nèi)存錯(cuò)誤。僅用于動(dòng)態(tài)分配的對(duì)象!

8.不要new與。(C?++?14)一起使用std::make_unique。它代替new來(lái)進(jìn)行內(nèi)存分配。

希望對(duì)你有幫助!
另外如果你想更好的提升你的編程能力,學(xué)好C語(yǔ)言C++編程!彎道超車,快人一步!
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來(lái)成長(zhǎng)!
另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~
