Xua*_* Ha 1 c++ reference smart-pointers vector c++11
std::vector<unique_ptr<int>> v;
v.push_back(std::make_unique<int>(1));
unique_ptr<int>& rp0 = v[0];
cout << "rp1="<<rp0.get()<<"\n";
cout << "*rp1="<<*rp0<<"\n";
v.push_back(std::make_unique<int>(2));
cout << "rp1="<<rp0.get()<<"\n";
cout << "*rp1="<<*rp0<<"\n";
Run Code Online (Sandbox Code Playgroud)
为什么第二张打印结果与第一张打印结果不同?
rp1=0x1783c20
*rp1=1
rp1=0
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
按照:https : //en.cppreference.com/w/cpp/container/vector/push_back我引用:
如果新的size()大于Capacity(),则所有迭代器和 引用(包括过去的迭代器)都将失效。否则,只有过去的迭代器是无效的。
因此,基本上,在执行push_back向量操作时,如果需要,可以创建一个更大容量的新缓冲区,将所有std::unique_ptr缓冲区从旧缓冲区移至新缓冲区,添加新unique_ptr缓冲区并删除旧缓冲区。
您有一个对旧缓冲区中悬挂的元素的引用。悬空的引用是未定义的行为,一切都会发生,例如,您可能正在打印垃圾数据或崩溃。
编辑:我解释了这个问题,在他们的回答中,遗忘症解释了一种可能的补救措施,该补救措施shared_ptr可能是适当的,或者在给定用例的情况下是未知的。