2013-12-14 168 views
3

我正在C開發一個應用程序,我需要使用第三方C++庫。所以,我基本上是圍繞C++庫編寫一個包裝器,以便可以從純C中的應用程序調用它。庫中的一些方法返回類型爲boost :: shared_ptr的指針,我需要將其轉換爲void * [for C],然後將其轉換回boost :: shared_ptr類型以重用它以進行進一步處理。我用下面的方法來進行轉換:boost :: shared_ptr void *反之亦然

到void *:

void * func1() 
{ 
    //after the boost::shared_ptr is created 
    return static_cast<void *> (SHARED_PTR.get()) 
} 

從無效*:

void func2(void * VOID_PTR) //VOID_PTR returned by func1 
{ 
    boost::shared_ptr<T> SHARED_PTR = *(boost::shared_ptr <T> *)(VOID_PTR); 
} 

但是,我得到的FUNC2 SIGSEGV,我相信這是發生因爲shared_ptr被取消分配,因爲它的引用計數變爲0.

我一直在尋找正確的方法來完成這個轉換和來自SO社區專家的建議。

在此先感謝!

+1

不宜背鑄真的是初始化呢?如'boost :: shared_ptr (VOID_PTR)'? – 2013-12-14 11:36:26

回答

0

一種可能的方式是:

void func2(void * VOID_PTR) //VOID_PTR returned by func1 
{ 
    boost::shared_ptr<T> SHARED_PTR(static_cast<T*>(VOID_PTR)); 
} 

請記住,當你正在做shared_ptr-> void *的轉換,你是迴避的引用計數,也就是說,它可能是您的無效*指針將是無效的在一個點上。

4

想想誰擁有T的實例,以及何時。

我猜你正在從C++庫函數中獲取shared_ptr,獲取它的值,然後讓shared_ptr超出範圍。發生這種情況時,如您所建議的那樣,託管對象將被刪除。

要解決這個問題,您必須保持原始shared_ptr在您使用其管理對象的整個生命週期內保持活動狀態。

void* func1(const boost::shared_ptr<T>& sharedPtr) 
{ 
    add_to_some_kind_of_persistent_storage(sharedPtr); 
    return static_cast<void*>(sharedPtr.get()); 
} 

你也可以使用一個小技巧與客戶刪除器對象,以有效地從shared_ptr的釋放被管理的對象,但如果有掛在其管理同一對象的shared_ptr的其他情況下,這可能是不安全的。在這裏看到:Detach a pointer from a shared_ptr?

要通過它放回:

boost::shared_ptr<T> func2(void* voidPtr) //VOID_PTR returned by func1 
{ 
    return boost::shared_ptr<T>(voidPtr); 
}