std::unique_ptr 在获得所有权之前进行测试
std::unique_ptr test before taking ownership
我有一个类,它基本上是一个队列,用于在 2 个线程之间传输动态分配的对象。第一个线程创建对象,第二个线程使用它们。我使用std::unique_ptr
将对象所有权从线程 1 传递到线程 2。
实际上,对将对象放入队列的方法的调用如下所示:
queue.put(std::move(unique_ptr_to_my_object));
和签名:
bool Queue::put(std::unique_ptr<T> p);
问题是put()
方法必须检查某些条件才能决定是否可以将对象添加到队列中。如果条件为 false,该方法只需返回 false 以指示它无法将对象添加到队列中,但对象被销毁,因为所有权已被put()
取得。
所以我想知道是否可以像这样重写put()
或者是否有更好的解决方案:
bool Queue::put(std::unique_ptr<T> &ref) {
if(CANNOT_ADD)
return false; // ownership remains in the calling function
std::unique_ptr<T> p = std::move(ref); // we know we can add so take ownership
/* ... */
}
是的,这很好。 另一种选择是:
std::unique_ptr<T> Queue::put(std::unique_ptr<T> p) {
if (CANNOT_ADD)
return p; // Ownership returned to caller.
/* ... */
return {}; // Return empty nullptr to indicate success.
}
您的方式具有以下优势:如果...
中的代码抛出,调用方将保留所有权。
您可以将函数的签名更改为:
std::unique_ptr<T> Queue::put(std::unique_ptr<T> p);
因此,如果该函数无法接受该对象,它将返回该指针,否则nullptr
。另一种解决方案是有条件地取得所有权:
bool Queue::put(std::unique_ptr<T> &&p);
并且只有在成功时才移出对象。在这种情况下,接受右值引用与左值 1 更好,原因至少有 2 个:
- 您仍然可以暂时通过。
- 需要在调用代码时显式使用
std::move
。
尽管您可以在std::move
制作此变体后使用该指针这一事实的可读性较差。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 换位表导致测试失败(但在游戏中运行良好)
- 用于交叉编译和CMake的预处理器宏的单元测试
- 谷歌测试中的期望值存储在哪里
- 如何在for循环中包含两个索引值的测试条件
- 智能指针概念所有权和寿命
- std::unique_ptr 在获得所有权之前进行测试