C++ 类内new的指针,如何释放?

舒泱 2020-04-08 05:15:10
用邻接表存有向图,顶点和边结点都是用类来实现的,图每次新增一条边时,调用add_edge()函数就会new一个边节点,等整个图建好时,不知道new了多少个边节点,但也不能new之后马上delete掉,因为整个图还没建完。

怎么去回收这部分内存呢?在哪里delete?

class My_graph {
private:
// 边节点
class Edge_node {
public:
unsigned int vertex_id; // 顶点
int edge_data; // 边信息,如权重
Edge_node* next{ nullptr };
Edge_node() = default;
Edge_node(unsigned int v_id, int edge_info) {
this->vertex_id = v_id;
this->edge_data = edge_info;
next = nullptr;
}
};

// 顶点节点
class Vertex_node {
public:
int vertex_data; // 顶点数据
Edge_node* first_edge_node{ nullptr };
Vertex_node() = default;
Vertex_node(int vertex_data) {
this->vertex_data = vertex_data;
}
};

vector<Vertex_node> vertices;

public:
My_graph() = default;
void add_vertex(int vertex_data); // 添加顶点,并返回顶点在vector中的下标
bool add_edge(unsigned int v1,unsigned int v2, int edge_data=0);
};

void My_graph::add_vertex(int vertex_data) {
vertices.push_back(Vertex_node(vertex_data)); // 添加顶点
}

// 就是下面这个增加边的函数!!!
bool My_graph::add_edge(unsigned int v1,unsigned int v2, int edge_data) {
// new一个边节点,什么时候delete??????????????????????????????????
Edge_node* p = new Edge_node(v2, edge_data);
if (!p) {
return false;
}
// 前插法插入边节点
p->next = vertices[v1].first_edge_node;
vertices[v1].first_edge_node = p;
return true;
}
...全文
1141 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舒泱 2020-04-08
  • 打赏
  • 举报
回复
引用 5 楼 Italink 的回复:
你应该是用的链表来构建邻接表吧,看你用的头插法建立的,要delete当然也是通过遍历链表逐个delete,一般步骤是 p=head; if(p==nullptr) break; head=head->next; delete p; 上面这个是在死循环中,手机上打的,有点乱,你应该能懂
谢谢,已经按照这样的方法delete了,VS显示没有内存泄漏了。
Michael阿明 2020-04-08
  • 打赏
  • 举报
回复
在一个函数内new的,出这个函数之前要释放
Italink 2020-04-08
  • 打赏
  • 举报
回复
你应该是用的链表来构建邻接表吧,看你用的头插法建立的,要delete当然也是通过遍历链表逐个delete,一般步骤是 p=head; if(p==nullptr) break; head=head->next; delete p; 上面这个是在死循环中,手机上打的,有点乱,你应该能懂
舒泱 2020-04-08
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
建议你看一下 efficetive c++ 这本书 和 深入探索c++ 内存模型 你的问题不难讲清楚。关键如果你没有必要的基础知识。讲了你也可能不明白。
你能讲讲吗,我试试看我能不能看懂,谢谢
舒泱 2020-04-08
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
这些顶点都哪保存在vector<Vertex_node> vertices里,通过它可以拿到各个顶点,再通过顶点的Edge_node* first_edge_node拿到第一个邻接点,在通过邻接点的Edge_node* next{ nullptr };可以拿到下一个邻接点,依次类推,遍历vertices所有的顶点就可以把new出来的Edge_node*内存挨个free回收。
谢谢,按照这样做,VS显示没有泄露的内存了。
真相重于对错 2020-04-08
  • 打赏
  • 举报
回复
建议你看一下 efficetive c++ 这本书 和 深入探索c++ 内存模型 你的问题不难讲清楚。关键如果你没有必要的基础知识。讲了你也可能不明白。
qybao 2020-04-08
  • 打赏
  • 举报
回复
这些顶点都哪保存在vector<Vertex_node> vertices里,通过它可以拿到各个顶点,再通过顶点的Edge_node* first_edge_node拿到第一个邻接点,在通过邻接点的Edge_node* next{ nullptr };可以拿到下一个邻接点,依次类推,遍历vertices所有的顶点就可以把new出来的Edge_node*内存挨个free回收。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧