我目前正在将C ++库包装成一种语言,将包装的内存存储为void指针并执行自己的垃圾收集。在内部,每个对象都有一个结构,该结构保持void指针,跟踪引用计数,并在引用它的所有内容超出范围时清除数据。我无法控制这种机制。
C ++中的构造看起来像这样:
MyObject::MyObject(CoreObject this_)
{
this_->data = new MyObjectData();
}
然后,只要您想访问对象中的数据,就可以static_cast到您的数据类型并执行您想做的任何事情:
std::string MyObject::getName(CoreObject this_)
{
MyObjectData* myObject = static_cast<MyObjectData*>(this_->data);
assert(myObject != NULL);
return myObject->getName();
}
语言的来龙去脉并不重要,但这只是为了让您了解如何用这种语言包装代码。
现在,我正在包装的库在整个地方使用boost :: shared_ptr。这部分是为了使python绑定易于包装,因为共享指针非常适合python的内部引用计数。但是,要在这种新语言中利用它,我能够想到确保引用计数和垃圾收集不会相互干扰的唯一方法是使用双指针机制,即指向共享指针的void指针。
这样做,结构现在看起来像这样:
MyObject::MyObject(CoreObject this_)
{
this_->data = new boost::shared_ptr<MyObjectData>(new MyObjectData());
}
并且解除引用甚至更糟:
std::string MyObject::getName(CoreObject this_)
{
boost::shared_ptr<MyObjectData>* myObject = static_cast<boost::shared_ptr<MyObjectData>*>(this_->data);
assert(myObject != NULL);
assert(*myObject != NULL);
return (*myObject)->getName();
}
我已经输入了boost :: shared_ptr特化,但它仍然非常笨重。我还尝试将共享指针抽象为模板化类,但很快意识到我只是在改变问题。
我想知道是否有人对封装或更好的机制有任何建议吗?
非常感谢。