Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将共享\u ptr铸造提升为无效*_C++_Boost_Shared Ptr - Fatal编程技术网

C++ 将共享\u ptr铸造提升为无效*

C++ 将共享\u ptr铸造提升为无效*,c++,boost,shared-ptr,C++,Boost,Shared Ptr,我使用的是libev,它要求将我的数据强制转换为空*以符合它们预定义的结构。我需要将boost::shared_ptr强制转换为void*,然后将void*强制转换回boost::shared_ptr。这是我的代码 void foo(boost::shared_ptr<string>& a_string) { void* data = (void*)a_string.get(); boost::shared_ptr<string> myString((stri

我使用的是libev,它要求将我的数据强制转换为空*以符合它们预定义的结构。我需要将boost::shared_ptr强制转换为void*,然后将void*强制转换回boost::shared_ptr。这是我的代码

void foo(boost::shared_ptr<string>& a_string)
{
 void* data = (void*)a_string.get();
 boost::shared_ptr<string> myString((string*)data);
}
void foo(boost::shared_ptr&a_字符串)
{
void*data=(void*)一个_字符串。get();
boost::共享的_ptr myString((string*)数据);
}
我很确定这很好,但是我的代码设置方式我相信所有对我的字符串的共享\u ptr引用都超出了范围,因为这种强制转换方法不会增加使用计数,因此共享\u ptr在我仍然需要时释放内存

是否有办法手动增加/减少使用计数?理想情况下,我会在强制转换为void*时增加使用计数,将我的void*传递给另一个函数,将void*强制转换回共享的ptr,并减少使用计数


或者,如果有人知道这个问题的其他解决方案,我可以寻求任何帮助。

尝试
弱\u ptr

shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);

a_字符串
可能仍需要在
foo
之外的某个地方引用,具体取决于上下文和您对void指针所做的操作(如果它创建了新副本或对void数据进行操作)

如果您将
void*
强制转换回
boost::shared_ptr
,它将是一个新的共享指针,未链接到也指向
`void*
变量所指向内存的任何其他共享指针

我认为您需要做的是将此支持中的
enabled\u shared\u添加到您正考虑与该代码一起使用的类中

这允许您通过类上的成员函数(
shared_from_This
)获取共享的_ptr,该共享的_ptr将与现有的共享的_ptr共享所有权


有关更多详细信息,请参见。

唯一真正的方法是分配一个
共享的\u ptr
到某个足够长的地方,然后将
void*
设置为指向该位置。

弱的\u ptr不会增加使用计数,因此仍会释放内存。弱\u ptr有何帮助?您可以将观察者存储在一个类中,该类包含观察者和
共享\u ptr
。这将确保观察者的生存期与
共享\u ptr
拥有的对象的生存期相匹配或超过。另外,为什么不存储
共享\u ptr
本身的地址,而不是存储指向对象的地址呢?我发现了一种方法,制作了一个包含共享\u ptr的结构,并将该结构强制转换为空*。我还不确定我对这个解决方案的看法。另外,我在某个论坛上看到,您不应该使用共享\u ptr的地址。@user1229962:您将
void*
传递给什么?在事件回调中,void*会传递回SharedPointer。到那时,最初的SharedPointer都已超出范围。我想我只需要在堆上分配一个共享的ptr并将其传递给void,然后在回调中删除它。
void foo(boost::shared_ptr<string>& a_string)
{
 void* data = (void*)a_string.get();
 boost::shared_ptr<string> myString((string*)data);
 weak_ptr<string> temp(a_string); // prevent destruction before above line
 // or reference a_string in any meaningless way that CANT be optimised out 
 // pre-emptively by the compiler
}