我正在尝试使用一个C库,该库基本上只将typedefs
公开给内部使用的结构。问题是我想使用智能指针来管理作为库接口的原始指针的生存期,但是由于出现incomplete_type
错误,因此无法创建智能指针。注意,我已经问过一个先前的问题previous question,试图解决相同的问题,但是这个问题对我的实际问题却表现不佳:
我无法弄清楚如何使用智能指针指向C库中所需的类型。取而代之的是,我一直在使用指向基础原始指针的智能指针(请参见下文),但这并不是我想要的,而且可能也不理想。
这里是一些代码:
#include "librdf.h" // the library I need to use int main() { // call necessary to use the librdf library. librdf_world *world = librdf_new_world(); librdf_world_open(world); /* * Error: In instantiation of function template specialization * 'std::make_unique<librdf_world_s, librdf_world_s *&>' * allocation of incomplete type 'librdf_world_s' */ std::unique_ptr<librdf_world> w1 = std::make_unique<librdf_world>(world); /* // errors: * 1) Template argument for template type parameter must be a type // (on librdf_free_world left) * * 2) No matching function for call to 'make_unique' // (on std::make_unique<librdf_world, librdf_free_world>, right) * */ std::unique_ptr<librdf_world, librdf_free_world> w2 = std::make_unique<librdf_world, librdf_free_world>(world); /* Error: * In instantiation of template class 'std::unique_ptr<librdf_world_s, void (librdf_world_s *)>' * data member instantiated with function type 'void (librdf_world_s *)' // (on w3) * * No matching function for call to 'make_unique' candidate function template not viable: * cannot convert argument of incomplete type 'librdf_world *' * (aka 'librdf_world_s *') to 'void (&&)(librdf_world_s *)' for 1st argument // (on std::make_unique<librdf_world, decltype(librdf_free_world)>) */ std::unique_ptr<librdf_world, decltype(librdf_free_world)> w3 = std::make_unique<librdf_world, decltype(librdf_free_world)>(world); /* No error: * This version actually works and has been my strategy for a while now. Note, * I've been using shared_ptr because I need other objects to have a reference * to the `world` to create other objects from the library. An example call to the library would be: * librdf_new_node(world, ... other arguments ... ); * However using a smart pointer to a raw pointer doesn't solve the problem of automatically * managing the lifetime of the underlying raw pointer (according to valgrind). My attempt at * overcoming this issue is to wrap the smart pointer in a class and have the shared_ptr as * the single private variable. Then, in the destructor, when the shared_ptr::use_count gets to 1 * I call the C destructor. * i.e. * ~LibrdfWorld(){ // wrapper class name * if (world_.use_count == 1){ // world_ is private instance of shared pointer to librdf_world* * librdf_free_world(*world_.getWorld()); // call the c library destructor when ref count gets to 1 * } * */ std::shared_ptr<librdf_world*> w4 = std::make_shared<librdf_world*>(world); }
那么从c ++使用此库的最佳方法是什么?我是否使用原始指针并手动管理生命周期?我是否使用智能指针指向原始指针?还是我没有想到的另一种方式。
我正在尝试使用一个C库,该库基本上只将typedef公开给内部使用的结构。问题是我想使用智能指针来管理原始指针的生命周期,这些原始指针的生命周期...
std::make_shared
和std::make_unique
用于分配然后构造对象,并将其作为shared_
或unique_
指针返回。它希望接收将传递给您的类的构造函数的参数,并且需要完整的类型以便可以调用此构造函数。