2011-10-14 48 views
2

我需要智能指針類或模板,它可以在刪除發生後使其引用對象失效。關鍵點是使指針可用於調試多線程應用程序。C++中的智能指針與共享對象驗證

下面是一個例子,只是僞代碼:

void foo1(smart_ptr<myclass> ptr) 
{ 
    //some code 
    delete ptr; 
    //some other code 
} 

void foo2(smart_ptr<myclass> ptr) 
{ 
    //some code 
    function_wich_uses_ptr(ptr); 
    //some other code 
} 


int main() 
{ 
    myclass val = new myclass(); 
    smart_ptr<myclass> ptr(&val); 
    //somehow make a copy of ptr 
    smart_ptr<myclass> ptr2(ptr); 
    //some code 
    thread_start(foo1, ptr); 
    thread_start(foo2, ptr2); 
    // 
    return 0; 
} 

所以,我需要以某種方式foo2的跟蹤如果foo1已刪除參考PTR對象。一般來說 - 在任何一個「活着」的智能指針指向單個obect後,刪除該對象,所有其他指向同一對象的指針都應以某種方式「感覺」它,並將它自己的值設置爲NULL。

UPD我的壞,例如是不正確的

回答

3

你正在尋找一個非擁有智能指針。這正是boost::weak_ptr所做的。

+0

不完全是,weak_ptr可以從原始指針中創建,因此應該有'master'shared_ptr,但這意味着這個指針不會具有相同的功能。從指針的每個副本都需要刪除的可能性,所以這是不使用weak_ptr的另一個原因。 –

+0

@MaximEfimov:我不確定我瞭解你的情況。在你給的例子中,爲什麼你不能通過引用線程來傳遞'val'並在兩個線程完成後刪除它? –

+0

我修正了代碼示例,這是不對的。無論如何,我認爲需要更多描述。該指針被請求用於調試多線程應用程序。所以 - 它正在運行,例如,10個線程正在用同一個對象做一些工作。一個線程以某種方式結束並刪除了該對象,但其他線程仍在使用指向不存在對象的無效指針。我需要指針,它可以'通知'其他指向該對象的指針,它已被刪除,因爲它們應該自己爲NULL。希望它更清晰。 –