我有一个类,它基本上是一个队列,用于在 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 以指示它无法将对象添加到队列中,但该对象已被销毁,因为所有权已被 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.
}
您的方法的优点是,如果
...
中的代码抛出,则调用者保留所有权。关于c++ - 获得所有权之前的 std::unique_ptr 测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51826259/