我有一个类,它基本上是一个队列,用于在 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/

10-11 22:43