C++学习笔记——01

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

以上。

C++学习笔记——01

时间: 2024-10-11 06:58:09

C++学习笔记——01的相关文章

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

HTTP 学习笔记01

HTTP   hypertext transfer protocol (超文本传输协议) TCP/IP 协议集中的一个应用层协议 用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式 HTTP 1.0  会话方式 HTTP 1.1 方式 HTTP 请求消息结构 一个请求行,若干消息头,以及实体内容 其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开. GET   方式下是没有实体内容的 POST .PUT.DELETE 方式下请求消息才可以包含实体内容 HT

SWIFT学习笔记01

1.Swift,用来判断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = "if=====" }else{ greeting = "else===" } 2.运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break. 3.//使用..创建的范围不包含上界,如果想包含的话需要使用...,集合上,就是[)与[]的关系 for i

C++ GUI Qt4学习笔记01

C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概念:一个是“信号和槽”,另一个是“布局”. 窗口部件(widget)是用户界面的一个可视化元素,相当于windows系统中的“控件”和“容器”.任意窗口部件都可以用作窗口. 1.1Hello Qt 正确安装Qt4开发环境,创建工程目录hello,源代码文件名为hello.cpp,进入hello目录 (1

HTML学习笔记01

HTML学习笔记 HTML学习笔记01 一.HTML的定义 1 HTML就是"HyperText Markup Language","超文本标记语言".2 HTML不是<color="red">编程语言,而是一种标记语言.3 标记语言是一套标记标签.4 HTML使用标记标签来描述网页. 二.HTML标签 1 HTML标签是由尖括号包围的关键词.2 HTML标签通常是成对出现的.3 标签对中的第一个标签是开始标签,第二个标签是结束标签.

MVC4 学习笔记01

1 . ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别是什么?要注意什么吗? ActionResult 是一个抽象(abstract)类,ViewResult 只是ActionResult 的一个实现(implementation).如果你确认你返回的是一个视图(view),你可以直接返回类型为ViewResult.ActionResult 有很多的派生类,如果你很确定你要返回的类型,你可以明确的返回该类型.如果你并不是很清楚,或者你根本不想去理解

python学习笔记(01):python和c语言 标识符命名规则比较

python标识符命名规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识符名称的其他部分可以由字母(大写或小写).下划线(‘ _ ’)或数字(0-9)组成.标识符名称是对大小写敏感的.例如,myname和myName不是一个标识符.注意前者中的小写n和后者中的大写N.有效 标识符名称的例子有i.__my_name.name_23和a1b2_c3.无效 标识符名称的例子有2things.this is spaced out和my-name. c语言标识符命

DirectX10学习笔记&lt;01&gt; 搭建环境-在Visual Studio中配置DirectX

一.工具下载 IDE:Visual Studio 2008 SDK:DirectX SDK,可以从Microsoft的网站上免费下载到.SDK中还包含示例.工具和文档.自带的工具很有用,我们会经常使用其中的DDS纹理工具. 二.设置Visual Studio 2008 菜单栏->Tools->Options... 左边选择Projects and Solutions->VC++ Directories 右边Show directiories for:选择Include files,往下列

【zepto学习笔记01】核心方法$()(补)

前言 在很久之前,我们项目有一个动画功能,功能本身很简单,便是典型的右进左出,并且带动画功能 以当时来说,虽然很简单,但是受限于框架本身的难度,就直接使用了CSS3的方式完成了功能 当时主要使用transform与animation实现功能,并且用了一个settimeout执行回调,然后此事便不了了之了 但是出来混总是要还的,这不,最近相似的东西又提了出来,我们当然可以将原来的那套东西拿来用,但是看着那个settimeout总是不是滋味,因为这样捕捉回调的效果以及可能引起的BUG大家都懂,于是就