整理自 http://www.360doc.com/showWeb/0/0/180157.aspx,C++内存管理详解
【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
数组与指针区别:
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
内容复制与比较
不能对数组名进行直接复制与比较。示例7-3-2中,若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。
语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存,再用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)
…
malloc/free 的使用要点
函数malloc的原型如下:
void * malloc(size_t size);
用malloc申请一块长度为length的整数类型的内存,程序如下:
int *p = (int *) malloc(sizeof(int) * length);
我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。
* malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。
* malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。我们通常记不住int, float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。
在malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出 p = malloc(sizeof(p))这样的程序来。
* 函数free的原型如下:
void free( void * memblock );
为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。
new/delete 的使用要点
运算符new使用起来要比函数malloc简单得多,例如:
int *p1 = (int *)malloc(sizeof(int) * length);
int *p2 = new int[length];
这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。
--------------------------------
typedef的用法
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:
typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;
、#define的用法
#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编
译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:
#define INT int
#define TRUE 1
#define Add(a,b) ((a)+(b));
#define Loop_10 for (int i=0; i<10; i++)
#define
INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef.
分享到:
相关推荐
### 麻省理工免费课程:C语言内存管理和C++面向对象编程 #### 一、C语言简介 在《麻省理工免费课程:C语言内存管理和C++面向对象编程》这一课程中,首先对C语言进行了介绍。C语言是一种历史悠久且功能强大的编程语言...
### C语言内存管理详解 #### 一、内存管理的核心原则:正确获取与有效利用 C语言的内存管理是一项核心技能,对于程序的稳定性和效率至关重要。内存管理主要涉及两个方面:“正确地得到”和“有效地使用”。前者...
在C语言中,内存管理是程序开发中至关重要的一部分,它涉及到程序如何有效地使用和释放内存。内存分为不同的区域,如静态存储区、栈和堆,它们各有特点和用途。 1. **内存分配方式** - **静态存储区域分配**:这...
### C语言内存管理知识点 #### 一、C语言内存管理概览 在C语言中,内存管理是一项核心技能,尤其对于高效程序设计至关重要。本文档将深入探讨C语言中的内存管理机制,帮助开发者理解不同类型的内存分配以及如何...
C语言内存管理是编程中的重要概念,特别是在C和C++这样的低级语言中,程序员需要直接处理内存分配和释放。内存管理分为静态内存、栈内存和堆内存三类。 1. 静态内存(Static Memory):这部分内存由编译器自动管理...
有关C语言内存管理方面的培训资料,有兴趣的可以看下!
在C语言中,内存管理是编程过程中的关键环节,它涉及到如何分配、使用以及释放内存。内存分为四个主要区域:栈、堆、静态存储...通过深入学习和实践,可以掌握C语言内存管理的精髓,避免常见的编程陷阱,提升代码质量。
不过,可以明显看出,它涉及到函数参数的传递、局部变量的定义、全局变量与静态变量的区别、动态内存分配函数的使用(如malloc和相关函数)以及指针的打印操作,这些都是C语言内存管理的基础知识点。
在编程世界中,C语言因其低级特性而被广泛用于系统级编程,其中包括内存管理。内存管理是程序设计中的核心部分,它涉及到如何有效地分配、使用和释放内存资源。本主题将深入探讨如何使用C语言来实现内存管理的关键...
首先,我们要理解C语言内存管理。在C语言中,程序员需要手动分配和释放内存,使用`malloc()`和`free()`函数来动态地申请和释放内存块。这样的方式虽然需要更多的编程技巧,但也提供了更高的灵活性和对内存使用的精确...
### C语言内存管理:深入剖析内存泄漏及其防治策略 #### C语言概述 C语言作为一种通用且高效的编程语言,自20世纪70年代由丹尼斯·里奇在贝尔实验室开发以来,便因其强大的特性和广泛的适用性而在软件开发领域占据...
### C语言内存管理详解 #### 一、引言 在计算机科学领域,内存管理是程序设计中的一个核心问题。良好的内存管理不仅可以提升程序运行效率,还能有效避免内存泄漏等问题的发生。本文将根据提供的标题“C内存管理”...
C语言内存管理是程序员必须掌握的重要技能,尤其是在使用C语言编程时,因为C语言提供了直接操控内存的机制。内存管理包括了内存的分配、使用和释放,如果不谨慎处理,可能会导致各种问题,如内存泄漏、访问越界、空...
c语言操作系统课程设计内存管理 nt addCalculate(int sn,int sd)//地址换算,sn为逻辑地址,sd为段内地址 { int add; if(sn>s.len) { printf("段号%d大于段表长度%d,越界中断\n",sn,s.len); return 0; } ...
内存管理是编程中至关重要的一个环节,特别是在C语言中,程序员需要手动进行内存的分配与释放。理解C语言中的内存管理有助于我们编写出更高效、更健壮的程序。 首先,内存分配有三种主要方式: 1. 静态存储区域...