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 任何东西..
我有一个原始指针并希望回调拥有它。我想出了这个代码:
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 任何东西..