2012-03-29 1083 views
5

我正在使用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。

或者如果有人知道這個問題的另一種解決方案,我可以使用任何幫助。

+1

您可以將觀察者存儲在同時包含觀察者和'shared_ptr'的類中。這可以確保觀察者的生命週期在'shared_ptr'擁有的對象的生命週期中被匹配或超過。另外,爲什麼不存儲'shared_ptr'本身的地址,而不是存儲指向對象的地址? – Mankarse 2012-03-29 03:29:37

+0

我發現了一個破解包含shared_ptr並將結構轉換爲void *的結構。不知道我對此解決方案的感受如何。另外,我在某個論壇上看到你不應該使用shared_ptr的地址。 – 2012-03-29 03:37:09

+0

@ user1229962:你將'void *'傳遞給了什麼? – 2012-03-29 04:45:08

回答

4

這樣做的唯一方法是分配一個shared_ptr某處足夠長的時間,然後將void*設置爲指向該位置。

0

嘗試weak_ptr

shared_ptr<int> p(new int(5)); 
weak_ptr<int> q(p); 

編輯:對不起,我沒有正確讀取的問題;你可以儘量保持它的範圍,因此不會得到清理

更新:如果您在通話後引用變量A弱指針可實際工作,因爲這樣編譯器不能優化a_string的shared_ptr的破壞(因此,防止DECR引用計數爲零 - >釋放)你利用底層指針的

,所以你能做到這一點之前:

void foo(boost::shared_ptr<string>& a_string) 
{ 
void* data = (void*)a_string.get(); 
boost::shared_ptr<string> myString((string*)data); 
weak_ptr<string> temp(a_string); // prevent destruction before above line 
// or reference a_string in any meaningless way that CANT be optimised out 
// pre-emptively by the compiler 
} 

a_string仍可能需要foo d之外的某處引用epending上下文和你正在與空指針做(如果它創建一個新的副本或經營上的空白數據)

+1

weak_ptr不會增加use_count,因此內存仍將被釋放。 weak_ptr將如何提供幫助? – 2012-03-29 03:22:24

+1

更新了我的回覆。 – 2012-03-29 03:32:08

1

如果你施放void*boost::shared_ptr,這將是一個新的共享指針,沒有鏈接到任何其他指向`void*變量指向的內存的共享指針。

我認爲您需要做的是將enabled_shared_from_this支持添加到您正在使用shared_ptrs與該代碼一起使用的類中。

這使您可以通過類中的成員函數(shared_from_this)獲得將與現有shared_ptrs共享所有權的shared_ptr。

查看boost enabled_shared_from_this docs瞭解更多詳情。

相關問題