2007年6月7日 星期四

Boost shared_ptr

shared_ptr包含於Boost Smart Pointers裡面, 它可以儲存指標, 並保證在所有存取這個指標的shared_ptr被釋放後, 這個指標所指的記憶體會自動被釋放, 這有很多實用的用途, 例如

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, 在此就不舉例說明了......

沒有留言: