我们可以期待以下代码始终没有出错吗?
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());
答案 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());