`
lingyibin
  • 浏览: 196282 次
  • 性别: 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++编程指南学习笔记

    ### 高质量C++编程指南知识点总结 #### 1. 布尔变量的比较 在C++中,不应该直接将布尔变量与`TRUE`, `FALSE`或`1`, `0`进行比较。...以上总结了《高质量C++编程指南》中提到的关键知识点,希望对您的学习有所帮助。

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

    以上知识点只是冰山一角,深入学习"高质量C/C++编程指南",结合作者的笔记和总结,将有助于你在C/C++编程领域达到更高的水平。记住,实践是最好的老师,不断编码、反思和改进是成为优秀程序员的必经之路。

    高质量程序设计指南:C、C++语言(第3版)

    《高质量程序设计指南:C、C++语言(第3版)》不仅仅是一本技术书籍,更像是一位经验丰富的导师,引领着读者进入C/C++编程的世界。通过系统学习本书中的理论知识与实战技巧,读者能够显著提升个人编程技能,在职业...

    很好的C++学习资源

    C++是一种广泛使用的编程语言,尤其在系统软件、应用程序、游戏开发、设备驱动等领域...《C++ Primer》提供的学习笔记是初学者和进阶者都非常宝贵的资源,结合实际的编译器操作和错误调试,能够帮助你逐步精通C++编程。

    高质量c++-c编程指南

    《高质量C++/C编程指南》是一本专门针对C++和C编程的指南,它涵盖了编程的最佳实践、陷阱和技巧,以帮助程序员编写出高效、可维护的代码。这本书可能包括了模板元编程、异常处理、STL(标准模板库)的使用、内存管理...

    高质量程序设计指南:C++C语言(第三版)笔记

    《高质量程序设计指南:C++/C 语言(第三版)》是一本深入探讨软件开发质量和C++/C 编程规范的书籍...通过深入阅读和实践,读者将能够掌握编写高质量C++/C程序的技巧,并理解如何在实际开发中实施有效的软件工程方法。

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

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

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

    《高质量C++编程指南》是一本深受欢迎的C++学习资料,特别适合初学者作为入门教程。这本书结合了丰富的编程经验和实例,旨在帮助读者掌握C++编程的核心概念、语法和最佳实践。通过阅读这本书和相应的笔记,学习者...

    Visual C++/MFC学习笔记.doc

    《Visual C++/MFC学习笔记》是一份深入探讨C++和Microsoft Foundation Class (MFC)库的文档,旨在帮助读者掌握使用Visual C++开发Windows应用程序的技能。这份笔记主要分为六个章节,覆盖了从入门到高级的多个主题。...

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

    《高质量C++编程指南》是一本深受欢迎的C++学习资料,其中包含了丰富的编程实践经验和最佳实践。这本书的笔记部分尤为珍贵,它不仅涵盖了基础的语法和概念,还深入探讨了C++的高级特性和设计模式,对于提升编程技能...

    C++提高编程 学习笔记

    ### C++ 提高编程学习笔记:泛型编程与 STL 技术详解 #### 一、泛型编程概述 泛型编程是一种编程范式,通过在程序设计中使用参数化的类型来编写代码,使得同一段代码可以处理多种不同的数据类型。这种编程方式极大...

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

    这份"(强烈推荐大家看一看)高质量C++编程指南(有笔记)1"提供了丰富的资源,旨在帮助学习者提升C++编程技能,特别是在理解和应用方面。下面将详细讨论这份指南中可能涵盖的关键知识点。 1. **基础语法与数据类型**...

    QT高级编程视频教程-最强初级到高级编程开发丁林松--QT高级编程视频教程-最强初级到高级编程开发.zip

    通过学习,你可以提升自己的QT编程能力,开发出高质量、跨平台的应用程序。同时,提供的"QT高级编程视频教程-最强初级到高级编程开发丁林松--QT高级编程视频教程-最强初级到高级编程开发.txt"文本文件,很可能是课程...

    高质量C++编程指南

    从给定的文件信息来看,标题与内容存在明显的不匹配,标题提到的是“高质量C++编程指南”,然而内容却是关于法语学习的笔记。这里,我们将重点放在标题和描述所暗示的知识点上,即C++编程的相关知识。 ### 高质量...

    c/c++编程思想

    这个压缩包包含的PDF文件很可能包含了各种教程、笔记或者讲解,对于那些对C++编程感兴趣的人来说,是一份极好的学习资料。 C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向...

    新手C++学习笔记(仅供菜鸟成长参考).rar

    《新手C++学习笔记》是一份专为编程初学者打造的资源,旨在帮助那些刚刚踏入C++编程领域的“菜鸟”快速成长。这份笔记包含了前辈们的实践经验总结,具有很高的学习价值。文档以.doc格式存储,方便读者使用常见的文字...

    c++学习总结,在学习c++时做的一些笔记

    在深入探讨C++编程语言的学习经验之前,首先要理解C++是一种多范式、面向对象的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上发展而来。它提供了丰富的特性,包括类、模板、异常处理、命名空间、函数重载等...

    《C++编程思想》阅读笔记

    根据给定的文件信息,以下是对《C++编程思想》阅读笔记中提到的关键知识...以上就是从《C++编程思想》阅读笔记中提炼出的关键知识点,它们涵盖了从基础语法到高级编程概念的广泛内容,对于学习和理解C++语言至关重要。

Global site tag (gtag.js) - Google Analytics