【问题标题】:How can i cast between void* and boost shared ptr我如何在 void* 和 boost shared ptr 之间转换
【发布时间】:2012-07-26 10:29:05
【问题描述】:

我有以下几行:

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

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

A_SPtr instance = (void*)(var);

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

【问题讨论】:

  • 智能指针的目的是拥有堆分配的内存。例如A_SPtr instance = new A();
  • 从 shared_ptr 到 void - void* ptr = s_ptr.get();
  • @AJG85 指针是在函数外部分配的,我想将它作为 void* 传递,然后再将其转回函数内部的 shared_ptr
  • 您的实际用例是什么?有几种不同的方法可以做到这一点(将指向共享指针的指针转换为 void *,使用 shared_from_this 等),正确的方法取决于您要实现的目标。
  • @David Schwartz 这个方法 f 是一个线程的例程(使用 pthread),它以 void* 的形式接收一个共享指针,然后我想将它转换回共享指针,以便使用其类的方法

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


【解决方案1】:

只需将指针转换为指向和来自void * 的共享指针。

  1. shared_ptrvoid *:

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

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

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

【讨论】:

  • @David Schwartz 有人建议调用 var.get() 以获得它的 void* ...你知道它是否有效吗?另外,你的意思是写 f (reinterpret_cast(&var)); ?
  • get 函数从共享指针中获取指向对象的指针。问题询问如何取回共享指针。 (这就是我问用例是什么的原因。你说“我想将它转换回共享指针”。)实际上,你应该只使用boost::bind
  • @cppguy:我同意。您可能应该创建一个new shared_ptr 以传递给线程,并在完成后拥有线程delete。或者,更好的是,使用 boost::bind 为您完成所有这些。
  • @user18853 reinterpret_cast&lt;void*&gt;(new std::shared_ptr&lt;A&gt;(A_SPtr)) 并将其传递给线程。在线程中,完成后将其转换回std::shared_ptr&lt;A&gt;*delete
  • @user18853 正确。这是将某些东西传递给线程的常见模式。您在堆上分配它,向线程传递一个指向它的指针,线程将指针转换回正确的类型,并在完成后将其删除。
【解决方案2】:

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

typedef boost::shared_ptr<A> A_SPtr;

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

编辑:从问题中不清楚,但一些 cmets 表明您实际上试图通过使用 void* 的“通用”接口传递智能指针。您可以按照对任何类型执行此操作的方式执行此操作:

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

然后你像这样传递指针:

A_SPtr a;
f(&a);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多