c++中动态分配的链表,异常后如何防止内存泄漏?

Dynamically allocated linked list in c++.What to do after exception to prevent memory leak?(c++中动态分配的链表,异常后如何防止内存泄漏?)

本文介绍了c++中动态分配的链表,异常后如何防止内存泄漏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我喜欢用c++实现链表,在添加新节点时我动态分配它,如果某些分配失败,我希望我的程序停止执行.

在新节点"失败后抛出异常,所以我必须在异常处理程序中显式调用析构函数.我该如何处理这种情况以防止内存泄漏?这是我写的代码

LinkedList.h

#pragma once#include #include 使用命名空间标准;类链表{上市:类迭代器;私人的:类节点{友元类迭代器;好友类 LinkedList;字符* m_word;节点 *m_next;节点(const char* word,Node* next = NULL,Node* prev = NULL);〜节点();};节点 *m_head,*m_tail;size_t m_num;上市:LinkedList():m_head(NULL),m_tail(NULL),m_num(0){};〜链表();链表&addFirst(const char* word);链表&addLast(const char* word);迭代器擦除(Iterator& it);迭代器开始();迭代器结束();迭代器 find(const char* word);size_t size()const{return m_num;};无效打印();友元类迭代器;类迭代器{链表&m_list;节点 *m_prev,*m_cur;好友类 LinkedList;无效的下一个();void setLast(){m_cur = NULL,m_prev = m_list.m_tail;}上市:迭代器(LinkedList&linkedList):m_list(linkedList),m_prev(NULL),m_cur(linkedList.m_head){}迭代器&运算符++();字符*运算符*();bool 运算符 != (Iterator& it){return (m_cur != it.m_cur || m_prev != it.m_prev);}};};

LinkedList.cpp

#include "LinkedList.h"LinkedList::Node::Node(const char* word,LinkedList::Node* prev,LinkedList::Node *next){char* tmpWord = new char[strlen(word)+1];strcpy(tmpWord,word);m_word = tmpWord;m_next = 下一个;如果(上一个!= NULL)prev->m_next = this;}LinkedList::Node::~Node(){删除[] m_word;}LinkedList::~LinkedList(void){for(Iterator it = begin();it != end();)擦除(它);}链表&LinkedList::addFirst(const char* word){Node* node = new Node(word,NULL,m_head);m_head = 节点;如果(m_tail == NULL)m_tail = m_head;++m_num;返回 *this;}链表&LinkedList::addLast(const char*word){如果(m_head == NULL)添加第一个(字);别的{Node* node = new Node(word,m_tail,NULL);m_tail = 节点;}++m_num;返回 *this;}LinkedList::Iterator LinkedList::begin(){迭代器 it(*this);把它返还;}LinkedList::Iterator LinkedList::end(){迭代器 it(*this);it.setLast();把它返还;}LinkedList::Iterator LinkedList::erase(LinkedList::Iterator& it){if(it.m_cur != NULL){节点* tmp = it.m_cur;if(it.m_prev != NULL)it.m_cur = it.m_prev->m_next = tmp->m_next;别的it.m_cur = it.m_list.m_head = tmp->m_next;if(tmp == it.m_list.m_tail)it.m_list.m_tail = NULL;删除tmp;--m_num;}把它返还;}LinkedList::Iterator LinkedList::find(const char* word){迭代器 it = begin();for(;it != end();++it){if(!strcmp(it.m_cur->m_word,word))休息;}把它返还;}void LinkedList::Iterator::next(){如果(m_cur != NULL){m_prev = m_cur;m_cur = m_cur->m_next;}别的m_prev = NULL;返回;}void LinkedList::print(){for(Iterator it = begin();it !=end();++it)cout<<it.m_cur->m_word;}LinkedList::Iterator&LinkedList::Iterator::operator ++(){下一个();返回 *this;}char* LinkedList::Iterator::operator *(){返回 m_cur->m_word;}//int main()//{//链表 ll;//ll.addFirst("1");//ll.addFirst("2");//ll.addLast("3");//ll.addLast("4");//LinkedList::Iterator it = ll.find("5");//返回 0;/

本文标题为:c++中动态分配的链表,异常后如何防止内存泄漏?

基础教程推荐