从 std::vector <int*> 中擦除元素

erasing element from std::vector <int*>

本文关键字:gt 擦除 元素 int std lt vector      更新时间:2023-10-16

我们可以期望以下代码始终工作而不会给出任何错误吗?

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());