如何混合C++共享指针和对象引用
How to mix C++ shared pointers and object references
我有以下代码,它在 Objective-C 函数work
中使用类 Datum
的C++对象:
void work(const Datum &datum) {
dispatch_async(dispatch_get_main_queue(), ^{
// Work with datum.
});
}
这段代码是用一个实际上是boost::shared_ptr<Datum>
的实例调用的,即
boost::shared_ptr<Datum> the_datum(new Datum());
work(*the_datum);
在这种情况下,实例the_datum
可能会在块在work
内运行之前被释放(对dispatch_async
的调用对稍后执行的datum
执行异步操作;调用和函数work
立即返回)。这显然会导致灾难。
一种解决方案可能是不传递对work
的引用,而是传递boost::shared_ptr<Datum>
。但在某些情况下,引用是首选的,例如请参阅此线程。有没有办法保留work
的接口(即将datum
传递作为引用),但仍然防止在块完成之前释放共享指针?
无法
通过让接口work()
相同的内容并传入对datum
的引用来实现这一点。无法使用datum
来防止引用计数减少。考虑以下错误程序:
#include <memory>
int main () {
std::shared_ptr<int> p1(new int);
int &x = *p1;
std::shared_ptr<int> p2(&x);
}
此代码以双重释放崩溃,因为 shared_ptr<>
控件结构不跟随指向对象的指针,而是跟随shared_ptr<>
本身。
您可以做的是更改work()
以采用shared_ptr()
,但向传递给dispatch_async()
的块添加更多代码,以便它可以在该代码中使用引用。由于您要将所有权转移到异步例程,因此应改用unique_ptr<>
。我知道 Objective-C 的 zilch,所以这个语法可能是错误的:
void work(std::unique_ptr<Datum> &datumptr_ref) {
__block std::unique_ptr<Datum> datumptr(std::move(datumptr_ref));
dispatch_async(dispatch_get_main_queue(), ^{
Datum &datum = *datumptr
// Work with datum.
});
}
您必须自己管理引用:
#include <iostream>
#include <memory>
extern "C" {
typedef struct TagShared Shared;
Shared* allocate(const std::shared_ptr<int>& ptr) {
return (Shared*) new std::shared_ptr<int>(ptr);
}
void deallocate(Shared* shared) {
delete (std::shared_ptr<int>*)shared;
}
} // extern "C"
int main()
{
std::shared_ptr<int> s(new int(1));
Shared* p = allocate(s);
// Inside Dispatch
// No C++ but similar defined for TagShared
std::cout << **(std::shared_ptr<int>*)p << std::endl;
deallocate(p);
return 0;
}
您想
通过std::unique_ptr
这样的事情来转让所有权:
void work(std::unique_ptr<Datum> datum) {
dispatch_async(dispatch_get_main_queue(), ^{
// Work with datum.
});
}
std::unique_ptr<Datum> the_datum(new Datum());
work(std::move(the_datum));
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针