以往在C++98寫的Code,䅰習慣用Raw Pointer來操作Object,在C++11/14之後,有了更安全的面貌。少了new/delete之後,接觸到Memory Leak的機會變少了。
Insert Element into container
1 | deque<Object *> objs; |
現在可以這麼寫
1 | deque<unique_ptr<Object>> objs; |
C++11有make_shared
部過沒有make_unique
,到C++14才加入,部過我們可以打造個一模一樣的版本。
1 | template<typename T, typename ...Args> |
Erase element from Container
以往的寫法大概就像這樣
1 | deque<Object*>::iterator it = std::find_if(objs.begin(), objs.end(), [](const Object *obj) -> bool { ... }); |
最常望記得就是那個delete,然後就造成Memory leak。
新的寫法就像這樣
1 | auto it = std::find_if(objs.begin(), objs.end(), [](const unique_ptr<Object> &obj) -> bool { ...}); |
被指向的Object resource會在某個時間點被歸還。
Get element from container
這邊可分成兩部份,單純瀏覽整個Container中的Elemeent,不對Container作任何動作。
或是當作資料結構,會改變Container本身的狀態。
先從第一種來說明,以往可能這麼作
1 | for (auto it = objs.begin(); it != objs.end(); ++it) |
用了unique_ptr之後,只能這麼做了
1 | for (auto it = objs.begin(); it != objs.end(); ++it) |
如果要直接操作Container,像輕空Buffer queue的情形時,以前的作法
1 | while (!objs.empty()) |
不過由於unique_ptr不像auto_ptr擁有copy semantics,因此上面的程式碼要改成
1 | while (!objs.empty()) |
可以看到,跟Raw Pointer操作相差無幾,不過利用RAII技術減少Memory leak的發生。