我有一个简单的菜鸟问题,我找不到答案:
在 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
谢谢。
我有一个简单的菜鸟问题,我找不到答案:
在 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
谢谢。
你没有。该对象不能被 删除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)...));
}
你没有。i
不是动态分配的,所以不需要删除。如果你在它的地址周围包裹一个智能指针,它会delete &i
在某个时候给你未定义的行为。您应该只将您new
编辑的内容包装在智能指针中,如下所示:
std::unique_ptr<int> ptr(new int(5));
智能指针的全部意义在于它为您管理动态分配对象的生命周期。i
具有自动存储持续时间,因此将在其范围结束时被销毁。你不需要任何东西来帮助你。
我相信这会奏效:
int i;
auto deleter = [](int *ptr){};
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter);
您必须提供一个什么都不做的自定义删除器。默认删除器无法删除未分配的自动变量new
。(然而,这违背了使用智能指针的目的,但表明它是可能的)。
当 unique_ptr 被销毁时会发生什么?或者另一种方式,当变量超出范围时?实际上没有任何意义