单链表内存泄露有关问题
单链表内存泄露问题
调试的时候出现:
Detected memory leaks!
Dumping objects ->
{79} normal block at 0x00383178, 8 bytes long.
Data: <d p 8 > 64 00 00 00 70 14 38 00
{65} normal block at 0x00382F28, 8 bytes long.
Data: < > 09 00 00 00 00 00 00 00
{64} normal block at 0x00382EE0, 8 bytes long.
Data: < (/8 > 08 00 00 00 28 2F 38 00
{63} normal block at 0x00382E98, 8 bytes long.
- C/C++ code
#include <iostream> #include <assert.h> #include <stdlib.h> #include <crtdbg.h> using namespace std; template<typename T>class CList; template<typename T> class CNode { public: CNode(){m_pNext = NULL;} //默认构造函数 CNode(const T &data){m_pNext = NULL; m_data = data; }//赋值 ~CNode(){} friend class CList; private: void AddAfter(T *node);//在该节点后面插入一个节点 void DelAfter(T *node);//删除该节点后面的一个节点 T m_data; CNode<T> * m_pNext; public: T GetData(){return m_data;} void SetData(T data){m_data = data;} }; //CList----------------------------- template<typename T> class CList { private: CNode<T> *head; public: CList(); CList(CNode<T> &node); ~CList(); void AddNode(CNode<T> *node);//在最后面添加一个新的节点. void AddNodeAt(CNode<T> *node, int n);//把node插入到索引为n的节点 CNode<T>* DelNodeAt(int n);//删除第n个节点,并返回 void DisplayAllNode();//显示所有的节点数据 }; void main() { CList<int> myList; int i; for (i = 0; i < 10; i++) { myList.AddNode(new CNode<int>(i)); } myList.DisplayAllNode(); myList.AddNodeAt(new CNode<int>(100),6); myList.DisplayAllNode(); // CNode<int>* abc = new CNode<int>(3333); // delete abc; _CrtDumpMemoryLeaks(); } //默认构造函数 template<typename T> CList<T>::CList() { head = new CNode<T>(); } //析构函数 template<typename T> CList<T>::~CList() { if(head != NULL) { CNode<T>* p = head; CNode<T>* q = NULL; //delete head; while (p != NULL) { q = p; p = p->m_pNext; delete q; q = NULL; } } } //通过节点来初始化一个链表 template<typename T> CList<T>::CList(CNode<T> &node) { head = new CNode<T>(); head->m_pNext = &node; } //在末尾插入 template<typename T> void CList<T>::AddNode(CNode<T> *node) { //assert(node != NULL); CNode<T> *temp = head; while (temp->m_pNext != NULL) { temp = temp->m_pNext; } temp->m_pNext = node; } //在指定节点插入 template<typename T> void CList<T>::AddNodeAt(CNode<T> *node, int n) { //assert(node != NULL || n > 0); CNode<T> *temp = head; CNode<T> *nextNext; int i = 0; while (i != n && temp != NULL) { temp = temp->m_pNext; i++; }//next指向的是n的前一个节点,head的索引可以认为是-1. if (i == n) { nextNext = temp->m_pNext; temp->m_pNext = node; node->m_pNext=nextNext; } } //输出所有的节点内容 template<typename T> void CList<T>::DisplayAllNode() { //输出内容, 头节点要跳过, 因为头节点没有内容 CNode<T> *temp = head->m_pNext; cout<<"输入所有的数据"<<endl; while (temp != NULL) { cout<<"temp->GetData(): "<<temp->GetData()<<endl; temp = temp->m_pNext; } } //删除第n个节点, 并返回 template<typename T> CNode<T>* CList<T>::DelNodeAt(int n) { //assert( n > 0); CNode<T> *temp = head; CNode<T> *nextNext; int i = 0; while (i != n && temp != NULL) { temp = temp->m_pNext; i++; }//next指向的是n的前一个节点,head的索引可以认为是-1. if (i == n) { //temp->m_pNext } return NULL; }
调试的时候出现:
Detected memory leaks!
Dumping objects ->
{79} normal block at 0x00383178, 8 bytes long.
Data: <d p 8 > 64 00 00 00 70 14 38 00
{65} normal block at 0x00382F28, 8 bytes long.
Data: < > 09 00 00 00 00 00 00 00
{64} normal block at 0x00382EE0, 8 bytes long.
Data: < (/8 > 08 00 00 00 28 2F 38 00
{63} normal block at 0x00382E98, 8 bytes long.