1. 如果沒有拷貝、賦值等要求,優先選用scoped_ptr
2. 如果不需要放入容器中(放入容器中的元素型別必須是能拷貝的),優先選用scoped_ptr
3. 如果不需要自定義刪除器,優先選用scoped_ptr
4. 盡量不要用scoped_array管理new出來的陣列,改用vector代替
5. 只能顯式呼叫建構函式來初始化。
shared_ptrsp(new int(8)); //正確
shared_ptrsp = new int(8); //錯誤
6. 如果要管理除了記憶體之外的其它資源,則需要自定義刪除器,此時要用shared_ptr。
shared_ptrfp(fopen("kof.txt", "r"), fclose);
7. 對於scoped_ptr和shared_ptr,如果使用預設建構函式,則其持有的是空指標,而不是野指標
8. 注意區別scoped_ptr和shared_ptr的reset方法,兩者都是停止對原指標的使用,改為持有空指標。不同之處是前者會引發原指標的刪除操作和相應的析構,後者是將原指標的引用計數減1,若減1後引用計數為0,才會引發原指標的刪除操作和相應的析構
9. scoped_ptr不支援比較運算,shared_ptr支援比較運算,包括相等、不等和小於
10. 用static_pointer_cast()等來進行shared_ptr的指標型別轉換,不能使用原始的強制型別轉換,也不能使用static_cast()
11. 盡量使用make_shared代替new來生成shared_ptr物件
12. 要有將shared_ptr用於工廠模式和橋接模式的意識
13. 利用shared_ptr的刪除器功能,實現退出作用域時呼叫任意函式
#include #include class kof ;
// 在func中做任意事情,不一定只能釋放資源
// 美中不足的是這裡的引數arg無法傳進來,就像執行緒函式那樣
// 由於void*指標可以指向任意型別,那麼也可以指向kof型別,所以滿足func的引數要求
void func(void *arg)
int main()
14. 盡量不要用shared_array管理new出來的陣列,改用vector代替
15. 客戶不要去管理被智慧型指標包裝起來的原始指標,讓智慧型指標自己管理,如有必要,定製刪除器即可
16. 避免迴圈引用造成的資源洩露
#include #include class b;
class a
~a()
void set(boost::shared_ptrsp)
private:
boost::shared_ptrsp_;
};class b
~b()
void set(boost::shared_ptrsp)
private:
//boost::shared_ptrsp_; // 用這一句代替下一句,會造成迴圈引用,a和b的析構函式均不會被呼叫
boost::weak_ptrsp_; // 用這一句代替上一句,可以解決迴圈引用,a和b都被析構
};int main()
17. 某些情況下,當需要使用某個類t的this指標作為引數時,要將該類t繼承自boost::enable_shared_from_this類,並在需要this指標的地方用shared_from_this()函式代替,這裡的shared_from_this()函式時繼承來的,不需要作用域符限定 C 智慧型指標使用
由於 c 語言沒有自動記憶體 機制,程式設計師每次 new 出來的記憶體都要手動 delete。程式設計師忘記 delete,流程太複雜,最終導致沒有 delete,異常導致程式過早退出,沒有執行 delete 的情況並不罕見。std auto ptr boost scoped ptr boost ...
boost 智慧型指標使用
1 scoped ptr 基本功能類似auto ptr。首先確保任何時候物件都能被正確的刪除。且 scoped ptr所有權不能轉讓,一旦獲取,無法從它那裡取回。scoped ptr 不能作為容器的元素,不允許不支援拷貝和賦值,因為拷貝和賦值函式是私有的。即,不存在 sp1 sp2 這樣的操作。sc...
std auto ptr智慧型指標使用
此篇博文記錄編碼過程中遇到的有關智慧型指標std auto ptr的使用方法,由於是記錄使用過程中遇到的方法所以不會將該智慧型指標的全部方法簡紹清楚,有關std auto ptr的詳細教程請參考相應的教程。1 reset pam 方法 使用pam重置智慧型指標,如 std auto ptrmessa...