Chapter2.h

#ifndef		__CHAPTER_2_
#define __CHAPTER_2_ /*《深入理解C指针》学习笔记 -- 第二章*/ /*
内存泄露的两种形式
1.忘记回收内存
2.内存地址丢失
*/
void __memory_leak_test(); /*
内存操作的几个函数
malloc
alloc
realloc
free
*/
void __memory_function_test(); #endif

Chapter2.cpp

#include "Chapter2.h"
#include <stdio.h>
#include <malloc.h>
#include <assert.h> /*
内存泄露的两种形式
1.忘记回收内存
2.内存地址丢失
*/
void __memory_leak_test()
{
/*申请了内存可是忘记了回收不用的内存*/
int* p_test1 = (int*)malloc(sizeof(int)); *p_test1 = 1;
// do_something_to : p_test1 /*当不须要再使用 p_test1 时,应该及时释放内存,并赋值 NULL*/
/*
free(p_test1);
p_test1 = NULL;
*/ /*内存地址在程序中丢失了,导致没有办法释放掉申请(堆中)的内存*/
int* p_test2 = (int*)malloc(sizeof(int)); *p_test2 = 2;
// do_something_to : p_test2 /*当不须要再使用 p_test2 时,应该及时释放内存。并赋值 NULL*/
/*
free(p_test2);
p_test2 = NULL;
*/
/*可是这个时候。又又一次申请了别的内存。导致,原来的内存地址丢失了*/
p_test2 = (int*)malloc(sizeof(int)); /*不须要使用这块内存后。应该显示的释放内存*/
free(p_test2);
p_test2 = NULL;
} void __memory_function_test()
{
/*
malloc 函数用于分配内存,返回 void* 类型的指针。指向分配内存的初始地址。
可是不正确这块内存进行初始化的操作
当内存申请失败时,返回NULL
*/
int* p_test1 = (int*)malloc(sizeof(int)); /*
假设申请的内存比較大,那么须要推断是是否申请失败,一般申请小的内存块不须要这种操作
*/
assert(p_test1 != NULL); //do_something_to_p_test1
/*使用完内存后应该及时释放,避免内存泄露*/
free(p_test1); /*
calloc 函数,从堆上分配内存,与 malloc 函数的不同之处在于
它会对申请的内存进行清零的操作
当内存申请失败时,返回NULL
*/
int* p_test2 = (int*)calloc(2, sizeof(int)); /*
上面的操作能够利用 malloc 和 memset 实现
int *p_test2 = (int*)malloc(2 * sizeof(int));
memset(p_test2, 0, 2 * sizeof(int));
*/ /*
假设申请的内存比較大,那么须要推断是是否申请失败。一般申请小的内存块不须要这种操作
*/
assert(p_test2 != NULL); //do_something_to_p_test2
/*使用完内存后应该及时释放。避免内存泄露*/
free(p_test2); /*
realloc 函数。一般用于对原来申请的内存做处理,申请更大的内存。或者缩小内存 1.假设參数为0。那么代表释放内存,就好像是使用 free 一样
2.假设申请的内存比当前分配的内存小,那么多余的内存会还给堆
3.假设申请的内存比当前分配的内存大,假设可能会紧挨着当前的内存的区域分配新的更大的内存。
否则。就在堆的其它区域分配并把旧的内存拷贝到新的区域
*/
char* p_test3;
char* p_test4;
char* p_test5; p_test3 = (char*)malloc(8 * sizeof(char*));
printf("p_test3 address is : %x\n", p_test3); p_test4 = (char*)realloc(p_test3, 64 * sizeof(char*));
printf("p_test4 address is : %x\n", p_test4); p_test5 = (char*)realloc(p_test4, 65 * sizeof(char*));
printf("p_test5 address is : %x\n", p_test5); /*
上述样例的执行结果例如以下:
p_test3 address is : 53a848
p_test4 address is : 53a8e0 又一次找了一个新的区域分配更大的内存
p_test5 address is : 53a8e0 在原来的内存上面分配更大的内存
*/ /*
不要反复释放内存,否则结果是没有定义的,例外是释放空指针(NULL)
*/
int* p_test6 = (int*)malloc(sizeof(int)); /*
free(p_test6); 这里是正确的操作
free(p_test6); 这里就会出现故障,由于释放了已经释放的内存
*/ /*
free(p_test6); 这里是正确的操作
p_test6 = NULL;
free(p_test6); 这里尽管是多次释放,可是前一步操作已经给指针赋值 NULL,free 不会出现故障
*/
}

深入理解 C 指针阅读笔记 -- 第二章的更多相关文章

  1. 深入理解 C 指针阅读笔记 -- 第六章

    Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_ /*<深入理解C指针>学习笔记 -- 第六章*/ typedef struct _ ...

  2. 深入理解 C 指针阅读笔记 -- 第五章

    Chapter5.h #ifndef __CHAPTER_5_ #define __CHAPTER_5_ /*<深入理解C指针>学习笔记 -- 第五章*/ /*不应该改动的字符串就应该用 ...

  3. 《ProgrammingHive》阅读笔记-第二章

    书本第二章的一些知识点,在cloudera-quickstart-vm-5.8.0-0上进行操作. 配置文件 配置在/etc/hive/conf/hive-site.xml文件里面,采用mysql作为 ...

  4. 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息

     第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...

  5. 《Interest Rate Risk Modeling》阅读笔记——第二章:债券价格、久期与凸性

    目录 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子

  6. 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常

    Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...

  7. Redis实战阅读笔记——第二章

    在性能的要求下,如何获取重构之前的构件

  8. Redis实战阅读笔记——第二章(redis重构web)

    在性能的要求下,如何用redis重构已有的已有的部分,其实整个例子背后的思路挺好的.在应用缓存的过程中,还有一指标个需要考虑,读写比.

  9. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

随机推荐

  1. 常用的 Maven 命令

    maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下. -D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试: -P 指定 ...

  2. ROS-节点-Topic

    前言:本部分主要介绍ros一些基础功能的使用,包括创建和编译工作空间.功能包.节点以及话题. 第一种方式:使用roboware studio软件操作 1.1 创建工作空间 回车然后点击保存. 1.2 ...

  3. E - A Trivial Problem(求满足x!的尾数恰好有m个0的所有x)

    Problem description Mr. Santa asks all the great programmers of the world to solve a trivial problem ...

  4. ASP.NET的Eval方法和Bind方法的区别

    Eval是只读的方法(单向数据在邦定),所邦定的内容为不会提交回服务器. 比如图书的ISBN,并不想让用户做任何修改,可以使用<%# Eval('ISBN').TOString().Trim() ...

  5. buf.readInt8函数详解

    offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的 offset 位置开始读取一个有符号的8位整数值. 设置 ...

  6. 【Oracle】truncate分区表

    分区表是生产中常用的一种表,它可以实现数据的按类存放,极大的提高了数据的查询及维护.当我们不需要某一分区的数据时,可以采用truncate来清空分区.实验如下: SQL)) partition by ...

  7. ASP.NET Cache 实现依赖Oracle的缓存策略

    ASP.NET 中的缓存提供了对SQL依赖项的支持,也就是说当SQL SERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中.这确实为程序员提供了方便.但 ...

  8. sql server 存储过程(事务,带参数声明,数据库瘦身)

    CREATE PROCEDURE procedureName (@var1 as varchar(50),@var2 as varchar(50)) --建立未发临时表 AS begin tran - ...

  9. windows下安装Python-Whl文件

    原文链接:http://blog.sciencenet.cn/home.php?mod=space&uid=1181151&do=blog&id=865515 Note1. 整 ...

  10. 10--C++多态

    C++多态 C++多态技术 摘要 本文描述了C++中的各种多态性.重点阐述了面向对象的动态多态和基于模板的静态多态,并初步探讨了两种技术的结合使用. 关键词 多态  继续  虚函数  模板  宏  函 ...