视觉删除对象指针的 2d 矢量C++

visual Delete 2d Vector of Object Pointers C++

本文关键字:2d 矢量 C++ 指针 删除 对象 视觉      更新时间:2023-10-16

我已经搜索了 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;

然而,我仍然会因此而感到记忆泄漏。有人可以告诉我我做错了什么吗?我真的不会使用智能指针。我不认识他们,我觉得他们对我在这里试图做的事情是矫枉过正的。必须有一个简单的方法。

-谢谢!

在分配例程中,您分配的所需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++;
}

如果你想保持代码不变,那么你需要添加一个测试来检查你是否已经分配了子对角线元素,或者通过创建一个新列表来修改内部循环:

for (auto i : odd_vertices) {
  oci = 0;
  for (auto j: std::vector<...>(i, odd_vertices.end())) {
    ...
  }
}

如果您确实需要使用指针,请改用它:

vector<vector<std::unique_ptr<MappedGraphItem>>> odd_vertex_matrix;

然后,vector将拥有分配的内存:当vector破坏时,它将被释放。

std::unique_ptr是C++11的新手,不是传统意义上的智能指针。