最近准备跳槽的事情,于是把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的时候的区别,很细微的错误,但是纠缠了快一个晚上才搞定,也作为提醒了。
以上。