从 std::vector <int*> 中擦除元素
erasing element from std::vector <int*>
我们可以期望以下代码始终工作而不会给出任何错误吗?
int a=1, b=1, c=1;
std::vector <int*> edges;
edges.resize(3);
edges[0] = new int;
edges[0] = &a;
edges[1] = new int;
edges[1] = &b;
edges[2] = new int;
edges[2] = &c;
delete edges[0];
edges[0] = NULL;
edges.erase(edges.begin());
delete edges[0];
edges[0] = NULL;
edges.erase(edges.begin());
delete edges[0];
edges[0] = NULL;
edges.erase(edges.begin());
我想
我知道你要去哪里,但是对于在C++之前学习过Java或C#的人来说,你已经陷入了一个常见的陷阱:
int a=1, b=1, c=1;
std::vector <int*> edges;
edges.resize(3);
edges[0] = new int; // this line is unnecessary
edges[0] = &a;
对new int
的调用为int
分配内存,并将地址存储在edges[0]
中。 但是下一行决定edges[0]
指向a
的地址。 new int
分配的内存泄漏。
更重要的是,对delete edges[0]
的调用实际上是对delete &a
的调用,这根本不是你想要的(你只能delete
nullptr
或你从new
那里得到的东西;你没有从new
那里得到a
)。
与Java或C#不同,new
实际上意味着C++。
不过,对edges.erase(edges.begin())
的呼吁都很好。
因此,经过编辑,这将起作用:
std::vector <int*> edges;
edges.resize(3);
edges[0] = new int(1);
...
delete edges[0];
edges.erase(edges.begin());
但我不得不想知道你为什么不使用 std::vector<std::unique_ptr<int>>
,它将为您处理内存管理:
std::vector<std::unique_ptr<int>> edges;
edges.resize(3);
edges[0] = std::unique_ptr<int>(new int(1)); // or edges[0] = std::make_unique(1); in C++14
...
edges.erase(edges.begin());
...
事实上,如果int
不是其他类型的替身(即,你实际上想要一个int
s的容器),你应该只使用std::vector<int>
:
std::vector<int> edges;
edges.resize(3);
edges[0] = 1;
edges[1] = 2;
edges[2] = 3;
edges.erase(edges.begin());
edges.erase(edges.begin());
edges.erase(edges.begin());
相关文章:
- 引用一个已擦除类型(void*)的指针
- 擦除while循环中迭代的元素
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- C++擦除(如果存在)
- 在映射擦除c++期间执行循环的次数
- 为什么擦除方法会影响结束方法
- C++ 字符串类擦除成员函数的时空复杂性
- 类型擦除的std::function与虚拟函数调用的开销
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- C++ 擦除函数中需要澄清
- 循环挂起迭代的 std::擦除 on std::list
- 擦除许多矢量元素,同时使用'auto'
- 如何擦除冗余输入?
- C++ STL 设置按值擦除
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 如何在写入文件时擦除最后一个逗号
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 双链表的擦除值函数,未知错误
- 如何编写用于多映射插入和擦除功能的 API?