将Object转换为std :: unique_ptr

时间:2012-12-25 21:16:53

标签: c++ pointers type-conversion

我有一个简单的菜鸟问题,我无法找到答案:

在C ++中如何转换常规对象

int i;

进入std::unique_ptr

std::unique_ptr<int> iptr = &i; //invalid
std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid

感谢。

4 个答案:

答案 0 :(得分:11)

你没有。 delete无法删除该对象,这是unique_ptr将要执行的操作。你需要

auto iptr = make_unique<int>();

在这里,我们将make_unique定义为与make_shared相同的实用函数,它应该是标准的,但遗憾的是被忽略了。以下是实施简要说明:

template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

答案 1 :(得分:5)

你没有。 i未动态分配,因此无需删除。如果你在地址周围包裹了一个智能指针,它会在某个时刻执行delete &i并给你未定义的行为。你应该只在智能指针中包含new ed的内容,如下所示:

std::unique_ptr<int> ptr(new int(5));

智能指针的重点在于它为您管理动态分配对象的生命周期。 i具有自动存储持续时间,因此将在其范围结束时销毁。你不需要任何帮助。

答案 2 :(得分:1)

我相信这会奏效:

int i;
auto deleter = [](int *ptr){};
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter);

您必须提供不执行任何操作的自定义删除工具。默认删除器无法删除未由new分配的自动变量。 (但是,这违背了使用智能指针的目的,但表明它是可能的)。

答案 3 :(得分:0)

当unique_ptr被销毁时会发生什么?或者另一方面,当变量超出范围时?实际上没有任何意义