立即取消引用unique_ptr
Immediately dereferencing unique_ptr
我对现代C++不是很熟悉,想更好地理解以下片段:
State & m_rootstate;
//...
auto currstate = std::make_unique<State> (m_rootstate);
do_something (*currstate);
// currstate is not used anywhere else
我看到一个unique_ptr
是从对State
的引用中创建的.这应该使用State
的复制 ctor 来创建State
的新实例,并且指向这个新实例的指针被包装在currstate
中。
然后,currstate
立即作为函数的参数被取消引用。currstate
之后不会使用,但在调用完成之前它不会超出范围,因此它及其链接State
不会被过早破坏。
对于调用,将使用unique_ptr
中的值。根据do_something
是State
还是State&
,它将被再次复制或不复制。
这是对的吗?如果是这样,unique_ptr
的目的只是创建m_rootstate
的副本而不必担心内存管理是否正确?
State & m_rootstate;
这本身毫无意义 - 我猜你遗漏了重要的东西。必须初始化引用。
//...
auto currstate = std::make_unique<State> (m_rootstate);
这会构造一个新的State
并将其包装在unique_ptr
中(在本例中通过复制构造函数,所以你是对的,它是一个副本(
do_something (*currstate);
// currstate is not used anywhere else
根据do_something采用状态还是状态&,它将再次复制或不复制。真。
如果是这样,unique_ptr的目的只是创建m_rootstate的副本而不必担心内存管理是否正确?
在这种情况下,似乎没有必要首先创建unique_ptr
。 您不妨像这样创建一个直接堆栈副本:
State currstate(m_rootstate);
这是对的吗?
你的描述是准确的,是的。
如果你的意思是问程序是否定义良好:忽略开头的未初始化引用,没有显示格式错误或具有未定义行为的代码。也就是说,您没有显示完整的程序,因此我们无法知道完整的程序是否正确。
如果是这样,
unique_ptr
的目的只是创建m_rootstate
的副本而不必担心内存管理是否正确?
正确。负责动态分配的内存管理确实是唯一指针类的目的。 (或者更一般地说,负责释放资源(。
请注意,显示的摘录根本没有揭示为什么或是否需要动态分配。它也没有透露为什么或是否需要副本。也许这些东西是需要的。但是,只要不需要这些事情,就应该避免。
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误