如何访问和打印unique_ptr的值,如何删除第三个值,从而减少容器的值,而不会造成分割错误
#include <memory>
#include <vector>
#include <iostream>
int main()
{
std::vector<std::unique_ptr<int>> vec;
for (int i = 0; i < 5; i++) {
int x(i);
std::unique_ptr<int> ptr2x(&x);
vec.push_back(std::move(ptr2x));
}
for (int i = 0; i != vec.size(); i++) {
std::cout << vec.at(i).get() << std::endl;
/* How to print the data stored in the unique_ptr */
if (i == 2) {
/* I want to remove the 3rd element from the vec
simultaneously, vec.size() should reduce to 4.
*/
}
}
return 0;
}
下面是我得到的输出。
此外,为什么所有5个元素的地址都相同。
0x7fff6641258c
0x7fff6641258c
0x7fff6641258c
0x7fff6641258c
0x7fff6641258c
munmap_chunk(): invalid pointer
这个问题的解决方法可以在这里找到。
每次循环迭代,您都会得到一个全新的变量x
。每次迭代它都会超出范围,它的生命周期也会结束。每个指向x
的指针都是无效的。
更不用说你试图接管所有权的x
,但x
不是你可以拥有的东西。您必须创建一个全新的值,并将该值复制到它。
简单的解决方案是跳过变量x
,直接创建i
的副本:
vec.emplace_back(new int(i));