2015-08-30 125 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& ..