我现在已经搜索了2个小时,并试图弄清楚如何完成这个非常简单的任务。
vector<vector<MappedGraphItem*>> odd_vertex_matrix;
当我向向量添加项目时,它看起来像这样:
for (auto i : odd_vertices) {
oci = 0;
for (auto j : odd_vertices) {
odd_vertex_matrix[ori][oci] = new MappedGraphItem(i, j, adjacentMatrix[i][j]);
odd_vertex_matrix[oci][ori] = new MappedGraphItem(j, i, adjacentMatrix[j][i]);
oci++;
}
ori++;
}
对于那些好奇的人来说,这就是MappedGraphItem类的样子
#include "common.h"
class MappedGraphItem {
public:
MappedGraphItem(int ari, int aci, float w) :
adj_row_index(ari),
adj_col_index(aci),
weight(w) {}
MappedGraphItem() :
adj_row_index(0),
adj_col_index(0),
weight(0) {}
~MappedGraphItem() {}
int adj_row_index;
int adj_col_index;
float weight;
};
当我去删除2d向量时,我使用它:
for (auto i = odd_vertex_matrix.begin(); i != odd_vertex_matrix.end(); ++i)
for (auto j = i->begin(); j != i->end(); ++j)
delete *j;
然而,我仍然因此而得到内存泄漏。有人能告诉我我做错了什么吗?我真的不会使用智能指针。我不认识他们,我觉得他们对我在这里要做的事情有些过分。必须有一个简单的方法。
-Thanks!
答案 0 :(得分:1)
在您的分配例程中,您分配所需数量MappedGraphicsItem
的两倍。
如果您有N
个奇数顶点,那么您将分配2*N*N
个元素。
删除例程虽然正确。
<强>理由:强>
开头的双for
循环是odd_vertices
与自身的笛卡尔积。
因此,它在每个for
循环中触摸每个顶点一次,因此N^2
内循环。
但是,每次触摸元素时都会分配 2个项目。
您可以通过忘记auto
语法并明确编写循环索引来查看它:
for (unsigned i = 0; i < odd_vertices.size(); ++i) {
oci = 0;
for (unsigned j = 0; j < odd_vertices.size(); ++j) {
odd_vertex_matrix[ori][oci] = new MappedGraphItem(odd_vertices[i], odd_vertices[j], adjacentMatrix[i][j]);
odd_vertex_matrix[oci][ori] = new MappedGraphItem(odd_vertices[j], odd_vertices[i], adjacentMatrix[j][i]);
oci++;
}
ori++;
}
如果你想保持你的代码 ,那么你需要添加一个测试来检查你是否已经分配了subiagonal元素,或者通过创建一个新列表来修改内部循环: / p>
for (auto i : odd_vertices) {
oci = 0;
for (auto j: std::vector<...>(i, odd_vertices.end())) {
...
}
}
答案 1 :(得分:0)
如果确实需要使用指针,请改用:
vector<vector<std::unique_ptr<MappedGraphItem>>> odd_vertex_matrix;
vector
将拥有已分配的内存:当vector
破坏时,它将被释放。
std::unique_ptr
是C ++ 11的新手,并不是传统意义上的智能指针。