4

我有这些行:

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

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

A_SPtr instance = (void*)(var);

我该怎么做?另外,我如何才能将含义从 shared_ptr 转换为 void*?

4

2 回答 2

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);
    

注意:这会将指向共享指针的指针传递给线程。如果共享指针在线程函数的生命周期内不存在,这将不起作用——否则,线程将拥有一个指向不再存在的对象(共享指针)的指针。如果您不能满足该要求,请在线程完成时将指针传递给的shared_ptr 和delete它。(或使用boost:bindwhich 直接与共享指针一起使用。)

于 2012-07-27T17:54:42.097 回答
0

只要您确定可以假定void*f 中传递给您的所有权是可以的,void*并且实际上确实引用了一个A对象,并且您知道清理的正确方法,那么您就可以继续使用 smart指向所有权的指针:

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接收到它时有效。

于 2012-07-27T18:16:20.147 回答