视觉删除对象指针的 2d 矢量C++
visual Delete 2d Vector of Object Pointers C++
我已经搜索了 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的新手,不是传统意义上的智能指针。
相关文章:
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何在 c++ 中格式化和访问 2D 矢量数组中的数据
- 读取字符串文本输入以创建 2D 矢量
- 识别 2D 矢量C++中的位置
- Cython:无法分配给 2D 矢量
- 按列随机播放 2D 矢量
- 初始化空的 2D 矢量?
- 如何在 2d 矢量 c++ 中复制元素并将其放在原始元素旁边
- 如何访问具有地图的2D矢量?
- 通过功能进行2D矢量输入和显示
- 在C++中将对象添加到 2D 矢量
- 太空入侵者 – 2D 矢量运动算法
- 从 2 个 1D 矢量创建 2D 矢量
- 如何仅使用其中一个维度在 2D 矢量中插入值?
- 在 2D 矢量中获取多个输入时出现问题
- 2D 矢量循环 C++
- C++ 2D 矢量到 2D pybind11 数组
- 在 2D 矢量数组中的特定标头下添加数据
- 在C++中使用 2D 矢量时出现明显的内存泄漏
- 从文本文件中读取一行并将其存储在 C++ 中的 2D 矢量中