Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++_C++11_Unique Ptr_Move Semantics - Fatal编程技术网

C++ 移动构造函数/分配std::unique\u ptr:内存重新分配?

C++ 移动构造函数/分配std::unique\u ptr:内存重新分配?,c++,c++11,unique-ptr,move-semantics,C++,C++11,Unique Ptr,Move Semantics,在使用std::unique_ptr的移动构造函数/赋值时,是否可以假定底层对象未在内存中重新分配,从而使指向它的原始指针保持有效 考虑以下计划: #include <memory> #include <utility> #include <iomanip> #include <iostream> template <class T> struct A { std::unique_ptr<T> data = nul

在使用std::unique_ptr的移动构造函数/赋值时,是否可以假定底层对象未在内存中重新分配,从而使指向它的原始指针保持有效

考虑以下计划:

#include <memory>
#include <utility>
#include <iomanip>
#include <iostream>

template <class T>
struct A {
    std::unique_ptr<T> data = nullptr;
    T *p;
    template <class... U>
    A(U&&... x) : data{std::make_unique<T>(std::forward<U>(x)...)}, p{data.get()} { }
};

int main()
{
    A<int> v{2};
    std::cout << std::hex << v.p << std::endl;
    A<int> w{std::move(v)};
    std::cout << w.p << std::endl;
}
从标准上看,

后置条件:get()生成在构造之前生成的值u.get()。u、 get()==nullptr

在move构造中没有内存分配;在
aw{std::move(v)}之后
w.data.get()
(和
w.p
)将与之前的
v.data.get()
相同,即
v.p

std::unique_ptr
的move构造函数被标记为
noexcept
,这也意味着此处没有内存分配

在这里,即使隐式生成的move构造函数也可以正常工作,添加一个用户定义的构造函数会更好,特别是您可以在移动的对象中将原始指针
p
设置为
nullptr
(为了一致性)

A(A&&other):数据{std::move(other.data)},p{data.get()}{other.p=nullptr;}
p(std::exchange(other.p,nullptr))
A(A<T>&& other) : data{std::move(other.data)}, p{data.get()} { }
unique_ptr(unique_ptr&& u) noexcept;
A(A<T>&& other) : data{std::move(other.data)}, p{data.get()} { other.p = nullptr; }