`
lingyibin
  • 浏览: 190902 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

高质量C++/C编程学习笔记(三)----- 内存管理(1)

阅读更多

1、 三种内存分配方式 

这是最基本的知识。

(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的 整个运行期间都存在。例如全局变量,static 变量。 (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函 数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多 少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

 

2、易错点

(1) 内存分配未成功,却使用了它。

应在使用前先检查是否为NULL, 如果在函数中则可用assert来判断:assert(p != NULL);

(2) 内存分配虽然成功,但是尚未初始化就引用它。

(3) 内存分配成功并且已经初始化,但操作越过了内存的边界。最常见的就是数组。

(4) 忘记了释放内存,造成内存泄露。

动态内存的申请与释放必须配对, malloc后记得 free,new后记得delete。

(5) 释放了内存却继续使用它。比较难发现的一个错误是用return返回指向“栈内存”的“指针”或者“引用” ,但该内存在函数体结束时就被自动销毁了。

(6)使用 free 或 delete 释放了内存后,要将指针设置为 NULL,否则会导致产生“野指针”

(7)不要忘记为数组和动态内存赋初值,防止将未被初始化的内存作为右值使用。

 

3、指针与数组

很多人都认为指针和数组是等价的,其实不然。

数组 要么在静态存储区被创建 (如全局数组) , 要么在栈上被创建。 数组名对应着 (而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。 指针 可以随时指向任意类型的内存块,它的特征是“可变” ,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

 

 

char a[] = “hello”; 
a[0] = ‘X’; 
cout << a << endl; 
char *p = “world”;     //  注意 p 指向常量字符串 
p[0] = ‘X’;            //  编译器不能发现该错误 
cout << p << endl; 

从上面这个例子可以看出, 指针 p 指向常量字符串“world” (位于静态存储区,内容为 world\0) ,常量字符串的内容是不可以被修改的。 

注意,不能把数组a的内容用b=a的方式赋值给数组b,因为这会产生编译错误。应该用strcpy 进行复制。

而if(p==a)  比较的不是内容而是地址,应该用库函数 strcmp来进行比较。

下面是它与指针在这些方面的差别。

 

 //  数组… 
 char a[] = "hello"; 
 char b[10]; 
 strcpy(b, a);   //  不能用 b = a; 
 if(strcmp(b, a) == 0) //  不能用  if (b == a) 
… 
 //  指针… 
 int len = strlen(a); 
 char *p = (char *)malloc(sizeof(char)*(len+1)); 
 strcpy(p,a);   //  不要用 p = a; 
 if(strcmp(p, a) == 0) //  不要用 if (p == a) 
… 

 

 4、计算内存容量。

这一点在面试时可以考倒一大堆人。

sizeof 可以计算出数组的容量(字节数),包括'\0'。如果参数是一个指针的话,那么返回的是指针的长度:4 。。 C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

还有一点:当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。看几个例子:

 

 char a[] = "hello world"; 
 char *p  = a; 
 cout<< sizeof(a) << endl; // 12 字节 
 cout<< sizeof(p) << endl; // 4 字节 
 void Func(char a[100]) 
 { 
  cout<< sizeof(a) << endl; // 4 字节而不是 100 字节 
} 
 

 

 

1
1
分享到:
评论

相关推荐

    高质量C++编程学习笔记.doc

    高质量C++编程学习笔记.doc

    高质量c++编程指南学习笔记

    自己整理的 觉得比较需要注意的地方记录下来(自己觉得比较重要的)

    高质量C/C++编程指南

    经典书籍 高清完整版 附带学习笔记 强烈推荐!!!

    高级C语言 C 语言编程要点

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    (强烈推荐大家看一看)高质量C++编程指南(有笔记)1

    对于C++学习很有帮助,特别是笔记,可以仔细看看

    (强烈推荐大家看一看)高质量C++编程指南(有笔记)下

    可以很好的对于你学习C++,有指导作用

    高级进阶c语言教程..doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    高级C语言详解

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    史上最强的C语言资料

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    c语言难点分析整理,C语言

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    免费下载:C语言难点分析整理.doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    C语言难点分析整理

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38...

    C语言难点分析整理.doc

    1. C 语言中的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数...

    若干源程序资料12.rar

    2012-06-11 21:16 97,280 C语言 内存管理详解.doc 2012-06-11 21:06 387,499 c语言写的一个多任务内核.rar 2012-06-11 21:15 6,669,174 C语言常用算法集(人手一份).pdf 2012-06-11 21:44 2,279 C语言编一个程序...

    leetcode题库-MyNote:`13的学习笔记

    Python》(编写高质量Python代码的59个有效方法) 《流畅的python》 源码学习 学习笔记 Python 自用工具代码库 Scheme 学习笔记 Scheme 学习笔记 《计算机程序的构造和解释》 学习笔记及部分例题答案 Verilog DHL 学习...

    高级C语言.PDF

    1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 ..........................................

    《算法导论》第二版中文全集,含:全世界唯一带“完整”目录的版本,代码。第3部分(共4部分)。学好核心技术,既为自己,也为天空不落下别国的炸弹

    数据结构教材 我强烈推荐Sartaj Sahni著《数据结构算法与应用 C++语言描述》 这是一部难得的好书 作者循序渐进 娓娓道来 每一种数据结构和算法都给出了详细的实现代码和运行结果 而且代码质量极高 甚至可以直接照搬...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    函授计算机毕业的自我鉴定.docx

    这三年里我学到了能重根本上了解计算机的运作,能用C/C++编写一些程序和修改一些程序。了解单片的应用等等知识。 三、存在问题及努力方向。 虽说是三年的函授学习,实际上面授只有三个月左右。虽说函授教师备课认真...

Global site tag (gtag.js) - Google Analytics