unique_ptr 的使用方法正确吗?

Is it a right way to use unique_ptr?

我有一个原始指针并希望回调拥有它。我想出了这个代码:

A* a = new A();
dosomething(callback(unique_ptr<A>(a).get()))

// The callback always takes a raw pointer.
void callback(A* a) {
}

这样做正确吗?

不,callback 不拥有它。但是,它将在 dosomething 完成后被销毁。

如果您构造 dosomething 来获取回调和 A *,然后 dosomething 调用 callback 并使用给定的 A * 作为参数,只要创建的 unique_ptr 仅在执行期间使用,它就可以工作。

示例:

void callback(A *a)
{
    if (!a) return;
    std::cout << "Got A " << a->name() << std::endl;
}

void dosomething(const std::function<void(A *)> &func, std::unique_ptr<A> obj)
{
    std::cout << "Doing some operation..." << std::endl;
    func(obj.get());
}

int main()
{
    dosomething(callback, std::make_unique<A>());
}

我会简化整个事情并使用 std::shared_ptr:

auto a = std::make_shared<A>();
callback(a);

这将要求您将 callback 声明为第一个获得 std::shared_ptr 的人。

当然,有点奇怪 callback 没有 return 任何东西..