c++ - C++ 中的释放(指针 vector 数组)

标签 c++ memory pointers memory-management vector

好的,所以我正在创建一个 Graph 类,我希望能够运行算法,并可能在今年夏天晚些时候有空的时候添加一个图形用户界面。现在我有一个 adjList 实现为 vector 数组(每个顶点一个),每个 vector 是一个指针列表,表示从每个关联顶点到其他顶点的边。它被声明为我的 Graph 类的 protected 成员,如下所示:

std::vector <Node*> *adjList;
adjList = new std::vector<Node*>[V];

我有一个附带问题。现在我有一个包含指针的 vector 数组(通过指针)。相反,如果这不是一个数组,而是一个指向单个节点指针 vector 的指针,那么我可以像这样调用构造函数:

adjList = new std::vector<Node*>(10);

这将允许我为 vector 中的动态数组指定默认大小,但似乎我无法调用构造函数,或者至少在我有数组时无法获得正确的语法。

现在是我最关心的问题。对于我的指针数组中的每个 vector ,我在我的 addVertex 方法中使用对 new 运算符的调用向每个 vector 添加了一些节点指针。现在我需要确保正确处理所有这些的释放。我相信我了解这在 C++ 中应该如何工作,但我知道指针很棘手,所以我想在我继续向这个代码库添加很多东西之前让别人看一下。通过几次搜索,我找不到任何与我所拥有的非常相似的东西。这是我的重新分配:

for(int i =0; i < V; i++)
    for (unsigned int j = 0; j < adjList[i].size(); j++)
        delete adjList[i][j];
delete adjList;

这会释放所有内存吗?还有一种简单的方法可以让我确定这一点,例如。在调试时记录使用 new 分配了多少内存?

[编辑:更新更多信息]

这是一个link到 Google Books,显示我想要在伪代码中实现的算法之一。此版本的广度优先搜索在邻接列表(指针列表数组)上运行。由于使用邻接表分配给每个节点的属性,因此必须使用指针。

我想在每个节点运行后保留我的 BFS 算法中存储的这些属性。我知道可以通过其他方式做到这一点,也许 inode 并使用并行数组来存储属性。但我希望拥有与此伪代码类似的代码(对于链接中的 BFS)。

最佳答案

  1. 为什么要使用 vector 数组?
  2. 为什么要维护指向 vector 的指针?
  3. 为什么要维护一个指针 vector ?

所有这三个决定都会让您付出代价,并直接否定 vector 类的内存管理能力。 vector 不仅仅是一个可以在幕后增长的数组,它还通过称为 RAII 的模式为您管理内存。 .

当你创建一个指针 vector 时, vector 无法清除指针在销毁时引用的内存,所以你仍然需要调用 delete在 vector 的每个元素上。

当您创建指向 vector 的指针时,您无法利用 vector 释放它在其析构函数中分配的任何内存这一事实。因此,您再次否定了 vector 为您管理内存的能力,因为您必须调用 delete。在 vector 上以防止内存泄漏。

当您维护一个 vector 数组时……好吧,您已经在使用 vector 了,为什么不直接使用 vector<vector<T>> 呢? ?

vector 类型在幕后为您动态分配内存,专门避免您现在遇到的这类问题。当然,您可以管理自己的内存(您只需按照您似乎掌握的与您分配的顺序相反的顺序解除分配),但是既然有适当的机制可以为您做这件事,为什么还要费心呢?

我不明白这里的设计目标。为什么不简单地使用 vector<vector<Edge>>并彻底摆脱这些问题?

class Edge {
    // whatever
}

class Graph {
private:
    // when instances of this class go out of scope, 
    // all of the memory allocated to these vectors is deallocated for you!
    vector<vector<Edge>> vertices;  
}

关于c++ - C++ 中的释放(指针 vector 数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407430/

相关文章:

c++ - 为什么ADL对运算符(operator)功能的行为不同于其他功能?

python - 在 python 中,MemoryError 和 OverflowError 有什么区别?

c - 我需要自定义内存分配器吗?

c++ - 包装枚举集

c++ - 需要跟踪 opencv Mats 的类型

c++ - 多重集的所有子树

c++ - 这个地址如何 (0x00000400) = 1024

c++ - 对 fstream 和指针感到困惑

C++:成员指针已初始化?

c++ - 将端口地址传递给函数