我如何在void*和boost shared ptr之间进行转换?

4
我有以下这些代码行:
typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...

我想要做类似这样的操作:

并且我希望能够像这样做:

A_SPtr instance = (void*)(var);

我该怎么做呢?同时,我如何将shared_ptr转换为void*?


智能指针的目的是拥有堆分配的内存。例如:A_SPtr instance = new A(); - AJG85
1
从 shared_ptr 到 void - void* ptr = s_ptr.get(); - ForEveR
@AJG85 指针是在函数外分配的,我想将其作为 void* 传递,然后再在函数内将其转换回 shared_ptr。 - CodeMonkey
你的实际使用情况是什么?有几种不同的方法可以做到这一点(将指针转换为共享指针到void *,使用shared_from_this等),正确的方法取决于你想要实现什么。 - David Schwartz
如果可以的话,请自己使用boost::thread。它使得将任意数据传递给线程变得微不足道。 - cppguy
显示剩余3条评论
2个回答

6

只需将指针转换为共享指针,然后从void *转换即可。

  1. shared_ptr to void *:

    f (reinterpret_cast<void *>;(&A_SPtr));
    
  2. void * back to shared_ptr:

    A_SPtr instance = * reinterpret_cast(boost::shared_ptr<A>*)(var);
    

注意:这里将一个指向共享指针的指针传递给了线程。如果共享指针在线程函数的生命周期内不再存在,则此方法将无法工作,因为线程将会有一个指向已经不存在的对象(共享指针)的指针。如果您无法满足此要求,请传递一个指向的shared_ptr,并在线程结束时使用delete进行清理。(或者使用直接支持共享指针的boost:bind。)


1
@cppguy:我同意。你应该创建一个new共享指针来传递给线程,并在完成后由线程delete它。或者,更好的方法是使用boost::bind,它可以为您完成所有这些操作。 - David Schwartz
@DavidSchwartz 你能举个使用 boost::bind 的例子吗?似乎不能将 Boost 绑定函数简单地转换为普通函数指针。 - dividebyzero
@dividebyzero,我无法在评论中回答。你能否提出自己的问题? - David Schwartz
2
reinterpret_cast<void*>(new std::shared_ptr<A>(A_SPtr)) 传递给线程。在线程中,将其转换回 std::shared_ptr<A>*,并在使用完后进行 delete 操作。 - David Schwartz
1
@user18853 正确。这是将某些内容传递给线程的常见模式。您在堆上分配它,将指向它的指针传递给线程,线程将指针强制转换回正确的类型,并在完成后删除它。 - David Schwartz
显示剩余7条评论

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接收它时指针仍然有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接