class MyClass {...};
MyClass* getMyClass()
{
return new MyClass();
}
void foo()
{
MyClass *c = getMyClass();
c->foo_1();
// ...
// 做了一堆鳥事
// ...
c->foo_n();
// 最後忘記把c這個pointer delete掉, 造成memory leak, 掯!!
}
當然, return一個heap-allocated object是programmer所應該極力避免的, 因為這是造成memory leak的最危險因素, 但是有時候呢, 還是會碰到需要的情況啊, 例如前人寫的程式已經根深蒂固, 根本沒有辦法修改了, 但是又想避免這種memory leak的可能, 這時候shared_ptr就派上用場了!!
class MyClass {...};
shared_ptr<MyClass> getMyClass()
{
return shared_ptr<MyClass>(new MyClass());
}
void foo()
{
shared_ptr<MyClass> c = getMyClass();
// ...
// ...
c->foo_1();
// 做了一堆鳥事
c->foo_n();
// ...
// ...
// 還是忘記c這個變數的存在...囧
}
雖然到了最後, 我們還是忘記了c的存在, 但是c已經是個shared_ptr而且是local variable, 所以在foo()的最後, c這個變數會從stack裡消失, 而它所包含的指標所指向的記憶體, 也隨著它的消失而自動的被釋放了, 這世界又變的更簡單一點了。而且, 只需要更改到綠色字體部份的code, 其他code完全不受影響, 因為shared_ptr也overload了->這個operator, 所以操作起來就跟操作原來的指標一樣!!
shared_ptr之所以叫shared_ptr, 也是因為可以有多個shared_ptr包含同一個指標囉, 當然, thread-safe它也有gurantee, 在此就不舉例說明了......
沒有留言:
張貼留言