我有一个简单的菜鸟问题,我无法找到答案:
在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
感谢。
答案 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被销毁时会发生什么?或者另一方面,当变量超出范围时?实际上没有任何意义