2015-08-30 165 views
1

說,我已經得到了它初始化像這樣的對象庫:的unique_ptr和庫C API與指針的指針功能可按參數

Type *object; 

lib_init(&object); // lib_init takes Type **object as the parameter 

所以,如果我想使用的庫我的代碼是什麼哪個使用智能指針? 這是一個正確的方法?

Type *pObject; 
lib_init(&pObject); 
unique_ptr<Type> object(nullptr); 
object.reset(pObject); 

還是有一個聰明的方法來做到這一點?

+0

該庫是否可以讓您在不再需要時清理對象? –

+0

圖書館的文檔對使用'lib_init'獲得的對象進行處理的說明是什麼?我預計會有相應的'lib_destroy'或者這些行。 「刪除對象」不太可能是處理由C語言庫分配的對象的正確方式,但除非另有說明,否則這就是unique_ptr所能做到的。 –

+0

是的,有'lib_dispose',我知道必須有一個自定義的刪除程序才能調用該函數。其實,我的問題的答案在這裏http://stackoverflow.com/a/24543176/135749。確切地說,我正在尋找的行爲。謝謝大家。 – Grigory

回答

2

你可以換初始化成返回一個唯一的指針的函數:

std::unique_ptr<Type> init_type() 
{ 
    Type* p; 
    lib_init(&p); 
    return std::unique_ptr<Type>(p); 
} 

然後

std::unique_ptr<Type> object(init_type()); 

。記住,除非該指針將被去分配與delete,你還需要提供一個自定義刪除器。例如,假設解除分配功能void lib_dispose(Type*),然後

std::unique_ptr<Type, void (*)(Type*)> init_type() 
{ 
    Type* p; 
    lib_init(&p); 
    return std::unique_ptr<Type, void (*)(Type*)>(p, lib_dispose); 
} 
+0

爲什麼不直接返回'unique_ptr'? (並且這樣的句柄也與自定義刪除的情況下) – Jarod42

+0

@ Jarod42沒有理由。這很有道理。請參閱編輯。 – juanchopanza

+0

@ Jarod42謝謝,修正。我不認爲'make_unique'在這裏是合適的,因爲舊API需要初始化一個指針。 – juanchopanza

2

我不認爲你需要在這裏的智能指針,你可以採取的標準庫爲std::string/std::vector等 - 包裝在RAII指針機制

class CType{ 
    Type* m_Ptr; 

    public: 
    CType(){ 
     lib_init(&m_Ptr); 
    } 

    ~Ctype(){ 
     lib_dispose(&m_Ptr); 
    } 

    //TODO: Copy constructor, move constructor assignment operators.. 

    operator Type&(){ 
     return *m_Ptr; 
    } 

    operator const Type&() const{ 
     return *m_Ptr;  
    } 

    operator Type*(){ 
     return m_Ptr; 
    } 

    operator const Type*() const{ 
     return m_Ptr;  
    } 

    Type* asPointer(){ 
     return m_Ptr; 
    } 
}; 

現在使用CTYPE任何地方,你會使用常規Type,多態性會踢,當您嘗試使用CTypeType*Type& ..