Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将对象转换为std::unique\u ptr_C++_Pointers_Type Conversion - Fatal编程技术网

C++ 将对象转换为std::unique\u ptr

C++ 将对象转换为std::unique\u ptr,c++,pointers,type-conversion,C++,Pointers,Type Conversion,我有一个简单的noob问题,我找不到答案: 在C++中如何转换规则对象 int i; 进入一个std::unique\u ptr std::unique_ptr<int> iptr = &i; //invalid std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid std::unique\u ptr iptr=&i//无效的 s

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

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

int i;
进入一个
std::unique\u ptr

std::unique_ptr<int> iptr = &i; //invalid
std::unique_ptr<int> iptr = static_cast<std::unique_ptr<int>>(&i); //invalid
std::unique\u ptr iptr=&i//无效的
std::unique_ptr iptr=静态_cast(&i)//无效的

谢谢。

你不需要。该对象不能通过
delete
删除,这是
unique\u ptr
将要执行的操作。你需要

auto iptr = make_unique<int>();
auto-iptr=make_unique();
在这里,我们将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)...));
}
template std::unique\u ptr make_unique(Args&&…Args){
返回std::unique_ptr(新的T(std::forward(args)…);
}

你没有<代码>i未动态分配,因此不需要删除。如果您在其地址周围包装一个智能指针,它将在某个点执行
delete&i
,并给出未定义的行为。您应该只将您拥有的
new
ed内容包装在智能指针中,如下所示:

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

智能指针的全部意义在于它为您管理动态分配对象的生存期<代码>i具有自动存储持续时间,因此将在其作用域结束时销毁。您不需要任何帮助。

当独特的ptr被破坏时会发生什么?或者换句话说,当变量超出范围时?实际上这毫无意义

我相信这会奏效:

int i;
auto deleter = [](int *ptr){};
std::unique_ptr<int, decltype(deleter)> iptr(&i, deleter);
inti;
自动删除器=[](int*ptr){};
std::唯一的ptr iptr(&i,删除器);

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

虽然为了完整性,该函数会很好,但我不认为它被忽略得太多,甚至不需要。请记住,make_shared解决了同时分配两个对象的问题(没有等效的构造函数),而unique_ptr根本不需要这个(它的设计开销为零)。这不是真的。例如,如果在一个函数调用中构造两个唯一的\u ptr,则仍然存在异常不安全性,这会使\u unique保存。您不能通过在该点直接创建唯一的\u ptr来避免这种情况吗
func(unique_ptr(new T),unique_ptr(new U))
no,它仍然不安全。