c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...
I.11: 永遠不要使用原始指針(T*)或引用(T&)來轉(zhuǎn)移所有權(quán)
原因
如果對調(diào)用者或被調(diào)用者是否擁有對象有任何疑問,就會發(fā)生泄漏或過早析構(gòu)。
示例
考慮:
X* compute(args) // 不要這樣做 { X* res = new X{}; // ... return res; }誰來刪除返回的X?當compute返回一個引用時,則更難發(fā)現(xiàn)問題??紤]按值返回結(jié)果(如果結(jié)果很大,使用move語義):
vector compute(args) // good { vector res(10000); // ... return res; }可選方法: 傳遞所有權(quán) 使用"智能指針",如unique_ptr(獨占所有權(quán))和shared_ptr(共享所有權(quán)),然而,這并不會比返回對象本身更優(yōu)雅和高效,所以只有在需要引用語義時才使用智能指針。
可選方法: 有時,由于ABI的兼容性要求和資源缺失,導致更舊代碼無法修改,在這種情況下,使用指南支持庫中的owner標記擁有指針:
owner compute(args) // 現(xiàn)在很清楚,所有權(quán)已經(jīng)轉(zhuǎn)移 { owner res = new X{}; // ... return res; }這告訴分析工具res是所有者,也就是說,它的值必須被delete或轉(zhuǎn)移到另一個所有者,就像這里的return所做的那樣。owner在資源句柄的實現(xiàn)中有也類似應用。
Note
作為原始指針(或迭代器)傳遞的每個對象都假定為調(diào)用者所擁有,因此它的生命周期由調(diào)用者處理。從另一個角度來看:與指針傳遞API相比,所有權(quán)轉(zhuǎn)移API相對較少,因此默認為“無所有權(quán)轉(zhuǎn)移”。
另請參閱: 參數(shù)傳遞、 智能指針參數(shù)的使用 和 按值返回.
實施
- (簡單) 警告delete非owner的原始指針,建議使用標準庫資源句柄或使用owner。
- (簡單) 每條代碼路徑上reset或顯式delete一個owner指針時,警告失敗。
- (簡單) 如果new的返回值或帶owner返回值的函數(shù)調(diào)用被分配給原始指針或非owner引用,則發(fā)出警告。
總結(jié)
以上是生活随笔為你收集整理的c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux cpp标准库,标准库以及标准
- 下一篇: 服务器里怎么更改网站图片大小,php实现