6

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

在 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

4 回答 4

12

你没有。该对象不能被 删除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)...));
}
于 2012-12-25T21:19:15.997 回答
5

你没有。i不是动态分配的,所以不需要删除。如果你在它的地址周围包裹一个智能指针,它会delete &i在某个时候给你未定义的行为。您应该只将您new编辑的内容包装在智能指针中,如下所示:

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

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

于 2012-12-25T21:20:02.330 回答
1

我相信这会奏效:

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

您必须提供一个什么都不做的自定义删除器。默认删除器无法删除未分配的自动变量new。(然而,这违背了使用智能指针的目的,但表明它是可能的)。

于 2012-12-25T21:25:00.363 回答
0

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

于 2012-12-25T21:20:13.597 回答