我正在使用libev,它要求將我的數據轉換爲void *以符合其預定義的結構。我需要將boost :: shared_ptr強制轉換爲void *,然後將void *轉換回boost :: shared_ptr。這裏是我的代碼做將shared_ptr強制轉換爲void *
void foo(boost::shared_ptr<string>& a_string)
{
void* data = (void*)a_string.get();
boost::shared_ptr<string> myString((string*)data);
}
我敢肯定,這工作得很好,但是我的方式代碼設置,我相信我的字符串的所有shared_ptr的引用都走出去的範圍,因爲這種鑄造方法不增加use_count,因此shared_ptr釋放內存,而我仍然需要它。
有沒有辦法手動增加/減少use_count?理想情況下,當我投射到void *時,我會增加use_count,將我的void *傳遞給另一個函數,將void *轉換回shared_ptr並遞減use_count。
或者如果有人知道這個問題的另一種解決方案,我可以使用任何幫助。
您可以將觀察者存儲在同時包含觀察者和'shared_ptr'的類中。這可以確保觀察者的生命週期在'shared_ptr'擁有的對象的生命週期中被匹配或超過。另外,爲什麼不存儲'shared_ptr'本身的地址,而不是存儲指向對象的地址? – Mankarse 2012-03-29 03:29:37
我發現了一個破解包含shared_ptr並將結構轉換爲void *的結構。不知道我對此解決方案的感受如何。另外,我在某個論壇上看到你不應該使用shared_ptr的地址。 – 2012-03-29 03:37:09
@ user1229962:你將'void *'傳遞給了什麼? – 2012-03-29 04:45:08