【问题标题】:Delete 2d Vector of Object Pointers C++删除对象指针的二维向量 C++
【发布时间】:2023-03-26 10:34:01
【问题描述】:

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

当我去删除二维向量时,我使用这个:

for (auto i = odd_vertex_matrix.begin(); i != odd_vertex_matrix.end(); ++i)
    for (auto j = i->begin(); j != i->end(); ++j)
        delete *j;

然而,我仍然遇到内存泄漏。有人可以告诉我我做错了什么吗?我真的不会使用智能指针。我不认识他们,我觉得他们对我在这里想要做的事情有点矫枉过正。一定有一个简单的方法。

-谢谢!

【问题讨论】:

  • oriodd_vertices 是什么?最好发布一个 MCVE。另外,你真的需要存储指针吗?
  • 数组在首次填充和删除之间是否会发生变化?即使您删除它的代码很好,如果数组正在更改,也会有泄漏。绝对推荐这种情况下的智能指针。
  • @juanchopanza orioci 只是从 0 开始的 int 计数器。adjacentMatrix 只是一个二维浮点数组。我不明白知道这些与我的问题有什么关系。我只想知道用什么语法来删除向量
  • @JamesDean 你看不出它为什么相关?因为根据索引的值,您可能会疯狂地泄漏内存?

标签: c++ visual-c++ memory-management vector memory-leaks


【解决方案1】:

在您的分配例程中,您分配了两倍数量的所需MappedGraphicsItem。 如果您有N 奇数顶点,那么您将分配2*N*N 元素。 删除例程是正确的。

理由:

开头的双for 循环是odd_vertices 与自身的笛卡尔积。 因此,它在每个for 循环中接触每个顶点一次,因此是N^2 内部循环。 但是,您每次触摸一个元素时都会分配 2 个项目

您可以通过忘记autosyntax 并显式编写循环索引来查看它:

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())) {
    ...
  }
}

【讨论】:

    【解决方案2】:

    如果您真的需要使用指针,请改用它:

    vector&lt;vector&lt;std::unique_ptr&lt;MappedGraphItem&gt;&gt;&gt; odd_vertex_matrix;

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

    std::unique_ptr 是 C++11 的新成员,并不是传统意义上的 smart 指针。

    【讨论】:

    • vector&lt;vector&lt;MappedGraphItem&gt;&gt;相比有什么好处?
    • @Bathsheba MappedGraphItem 类如上面我的代码所示。它仅由 3 个整数组成。
    • @juanchopanza 这有点做作。这主要是为了练习。我想了解这是如何做到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2011-05-02
    • 1970-01-01
    • 2011-06-10
    • 2014-04-28
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多