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

时间:2014-04-02 21:41:52

标签: c++ pointers

我们可以期待以下代码始终没有出错吗?

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

1 个答案:

答案 0 :(得分:3)

我想我知道你要去哪里,但是你已经陷入了在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;你没有从a得到new

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