最近准備跳槽的事情,於是把C++翻出來看,順便做了一些練習,主要是數據結構方面的,就貼在這裡做個系列,權當督促自己了。 第一天,寫了一個棧,調試了下沒什麼問題,內存洩露的問題也解決了。 復制代碼 1 #ifndef STACK_H 2 #define STACK_H 3 4 #include "stdlib.h" 5 #include "iostream" 6 7 class Stack 8 { 9 private: 10 typedef int NODE_DATA_TYPE; 11 typedef struct Node{ 12 NODE_DATA_TYPE data; 13 struct Node * next; 14 }Node; 15 Node *header; 16 public: 17 Stack() 18 { 19 header = 0; 20 } 21 ~Stack() 22 { 23 std::cout<<"Destructor called."<<std::endl; 24 while(header != NULL) 25 { 26 Node *temp = header; 27 header = header->next; 28 free(temp); 29 } 30 _ASSERTE(_CrtCheckMemory()); 31 std::cout<<"Destructor call finished."<<std::endl; 32 } 33 Stack(NODE_DATA_TYPE data) 34 { 35 header = (Node *)malloc(sizeof(Node)); 36 header->data = data; 37 header->next = NULL; 38 _ASSERTE(_CrtCheckMemory()); 39 } 40 bool isEmpty(void) 41 { 42 return header == 0 ? true : false; 43 } 44 void addElement(NODE_DATA_TYPE data) 45 { 46 if(header == 0) 47 { 48 header = (Node *)malloc(sizeof(Node)); 49 header->data = data; 50 header->next = NULL; 51 } 52 else 53 { 54 Node *newNode = (Node *)malloc(sizeof(Node)); 55 newNode->data = data; 56 newNode->next = header; 57 header = newNode; 58 } 59 _ASSERTE(_CrtCheckMemory()); 60 } 61 NODE_DATA_TYPE popElement(void) 62 { 63 if(header == 0) 64 { 65 std::cout<<"Empty stack,operation teminated."<<std::endl; 66 return -1; 67 } 68 else 69 { 70 NODE_DATA_TYPE popData = header->data; 71 Node *temp = header; 72 header = header->next; 73 free(temp); 74 _ASSERTE(_CrtCheckMemory()); 75 return popData; 76 } 77 } 78 void printStack(void) const 79 { 80 Node *temp = header; 81 while(temp != NULL) 82 { 83 std::cout<<temp->data<<std::endl; 84 temp = temp->next; 85 } 86 } 87 bool searchElement(NODE_DATA_TYPE data) 88 { 89 while(header->next != NULL) 90 { 91 if(header->data == data) 92 { 93 return true; 94 } 95 else 96 { 97 header = header->next; 98 } 99 } 100 return false; 101 } 102 }; 103 #endif 復制代碼 開始在這一句話: free(temp); 的時候始終報錯,錯誤如下: CRT detected that the application wrote to memory after end of heap buffer 後來求助之後發現是自己內存申請的時候出了錯,將 (Node *)malloc(sizeof(Node)) 寫成 (Node *)malloc(sizeof(Node *)) 導致的。 忽略了結構體和結構體指針在sizeof的時候的區別,很細微的錯誤,但是糾纏了快一個晚上才搞定,也作為提醒了。