如何在void *和boost共享ptr之间进行转换

时间:2012-07-27 17:44:12

标签: c++ boost casting shared-ptr void-pointers

我有这些话:

typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...

我希望能够做到这样的事情:

A_SPtr instance = (void*)(var);

我该怎么办? 另外,我怎样才能将另一种方式从shared_ptr转换为void *?

2 个答案:

答案 0 :(得分:6)

只需指向指向void *的共享指针的指针。

  1. shared_ptrvoid *

    f (reinterpret_cast<void *>;(&A_SPtr));
    
  2. void *返回shared_ptr

    A_SPtr instance = * reinterpret_cast(boost::shared_ptr<A>*)(var);
    
  3. 注意:这会将指针传递给指向线程的共享指针。如果共享指针在线程函数的生命周期中不存在,则这将不起作用 - 否则,线程将具有指向不再存在的对象(共享指针)的指针。如果您无法满足该要求,请在线程完成后将指针传递给 new shared_ptr和delete。 (或者使用直接使用共享指针的boost:bind。)

答案 1 :(得分:0)

只要您确定可以假定f中传递给您的void*的所有权,void*实际上是指A个对象,而您知道正确的清理方法,然后你可以继续使用智能指针来承担所有权:

typedef boost::shared_ptr<A> A_SPtr;

void *f(void *var){
    A_SPtr instance(static_cast<A*>(var));
}

编辑:问题尚不清楚,但有些评论表明您实际上试图通过使用void*的“通用”界面传递智能指针。您可以按照与任何类型相同的方式执行此操作:

void *f(void *var){
    A_SPtr *instance = static_cast<A_SPtr *>(var);
}

你传递指针如下:

A_SPtr a;
f(&a);

与任何指针一样,您必须确保对象的生命周期足以使指针在f收到时有效。