将sharedptr铸造提升为void*
boost shared_ptr casting to void*
我使用的是libev,它要求将我的数据强制转换为void*,以符合它们预定义的结构。我需要将boost::shared_ptr强制转换为void*,然后将void*强制转换回boost::shared_pt。这是我做的代码
void foo(boost::shared_ptr<string>& a_string)
{
void* data = (void*)a_string.get();
boost::shared_ptr<string> myString((string*)data);
}
我确信这很好,但我的代码设置方式我相信所有对我的字符串的shared_ptr引用都超出了范围,因为这种强制转换方法不会增加use_count,因此shared_ptr在我仍然需要内存的时候释放了内存。
有没有办法手动增加/减少use_count?理想情况下,当我转换为void*时,我会增加use_count,将我的void*传递给另一个函数,将void*转换回shared_ptr,并减少use_count。
或者,如果有人知道这个问题的另一个解决方案,我可以寻求任何帮助。
实现这一点的唯一真正方法是将shared_ptr
分配到某个可以使用足够长时间的位置,然后将void*
设置为指向该位置。
如果将void*
强制转换回boost::shared_ptr
,它将是一个新的共享指针,而不会链接到任何其他共享指针,这些指针也指向`void*
变量所指向的内存。
我认为您需要做的是将enabled_shared_from_this
支持添加到您正在考虑与该代码的shared_ptrs一起使用的类中。
这允许您获得一个shared_ptr,它将通过类上的成员函数(shared_from_this
)与现有的shared_ptrs共享所有权。
有关更多详细信息,请参阅boost enabled_shared_from_this文档。
尝试weak_ptr
:
shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);
编辑:对不起,我没有正确阅读问题;你可以试着把它保持在范围内,这样它就不会被清除
更新:如果您在调用后引用变量,弱指针实际上可能会起作用,因为在您使用底层指针之前,编译器无法优化对a_string
shared_ptr的破坏(因此防止decc refcount为零->发布)
所以你可以这样做:
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
}
a_string
可能仍然需要在foo
之外的某个地方引用,这取决于上下文和您对void指针所做的操作(如果它创建了一个新副本或对void数据进行操作)
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 将sharedptr铸造提升为void*