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";
为什么第二张打印结果与第一张打印结果不同?
rp1=0x1783c20
*rp1=1
rp1=0
Segmentation fault (core dumped)
最佳答案
按照:https://en.cppreference.com/w/cpp/container/vector/push_back,我引用:
因此,基本上,在执行push_back
时,如果需要, vector 会创建一个更大容量的新缓冲区,将所有std::unique_ptr
从旧缓冲区移至新缓冲区,添加新unique_ptr
并删除旧缓冲区。
您有一个对旧缓冲区中悬挂的元素的引用。悬空的引用是未定义的行为,所有事情都可能发生,例如,您可能正在打印垃圾数据或崩溃。
编辑:我在他们的回答中解释了问题Oblivion,它说明了使用shared_ptr
的可能的补救措施,该补救措施可能合适,或者在未知的用例下不适用。