gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:37:32 24 4
gpt4 key购买 nike

好的,所以我正在创建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com