8、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个字节。最好用以下程序作一次测试:
cout << sizeof(char) << endl; cout << sizeof(int) << endl; cout << sizeof(unsigned int) << endl; cout << sizeof(long) << endl; cout << sizeof(unsigned long) << endl; cout << sizeof(float) << endl; cout << sizeof(double) << endl; cout << sizeof(void *) << endl; |
在malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出 p = malloc(sizeof(p))这样的程序来。
* 函数free的原型如下:
void free( void * memblock ); |
为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。
9、new/delete 的使用要点 运算符new使用起来要比函数malloc简单得多,例如:
int *p1 = (int *)malloc(sizeof(int) * length); int *p2 = new int[length]; |
这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。例如
class Obj { public : Obj(void); // 无参数的构造函数 Obj(int x); // 带一个参数的构造函数 … } void Test(void) { Obj *a = new Obj; Obj *b = new Obj(1); // 初值为1 … delete a; delete b; } |
如果用new创建对象数组,那么只能使用对象的无参数构造函数。例如
Obj *objects = new Obj[100]; // 创建100个动态对象 |
不能写成
Obj *objects = new Obj[100](1);// 创建100个动态对象的同时赋初值1 |
在用delete释放对象数组时,留意不要丢了符号‘[]’。例如
delete []objects; // 正确的用法 delete objects; // 错误的用法 |
后者相当于delete objects[0],漏掉了另外99个对象。
10、一些心得体会 我认识不少技术不错的C++/C程序员,很少有人能拍拍胸脯说通晓指针与内存管理(包括我自己)。我最初学习C语言时特别怕指针,导致我开发第一个应用软件(约1万行C代码)时没有使用一个指针,全用数组来顶替指针,实在蠢笨得过分。躲避指针不是办法,后来我改写了这个软件,代码量缩小到原先的一半。
我的经验教训是:
(1)越是怕指针,就越要使用指针。不会正确使用指针,肯定算不上是合格的程序员。
(2)必须养成“使用调试器逐步跟踪程序”的习惯,只有这样才能发现问题的本质。
分享到:
相关推荐
《超越C++标准库——Boost程序库导论》是一本深度探讨C++开发中的Boost库的专著。Boost库是C++社区公认的扩展标准库,它包含了大量的高效、高质量的可重用C++组件,旨在提升C++的灵活性、效率和可移植性。这本书面向...
C++课程设计——个人财务管理,作为大学课程设计挺不错的,希望对大家有帮助。
本书是Ford和Topp两位教授于1996年出版的名著Data Structures with C++的第2版,新版中引入了在ANSI C 1998中正式规定的标准模板库(STL)来讲授数据结构,在全球范围内已经有数以万计的学生从中受益。 作者将C++...
主要内容:● 使用JNI将原生代码连接到Java中● 使用SWIG自动生成JNI代码● 使用POSIX线程实现多线程应用● 使用POSIX套接字实现网络应用● 使用logging、GDB和Eclipse调试器进行调试● 使用Valgrind分析内存● 使用...
【C++课程设计——学生管理系统】是一个典型的面向对象编程项目,旨在帮助学习者掌握C++语言在实际问题解决中的应用,特别是数据管理与系统设计。在这个项目中,学生管理系统是用C++实现的一个小型数据库系统,它...
7. **第八章 对象生灭.ppt** - 这部分可能会深入探讨对象的生命周期,包括动态内存管理(new和delete操作)、栈与堆的区别,以及智能指针的使用,防止内存泄漏。 8. **第九章 继承.ppt** - 继承是面向对象编程的三...
理解内存管理是避免程序错误的关键,书中会讨论动态内存分配、指针操作以及内存泄漏等问题。此外,异常处理是确保程序健壮性的重要手段,书中会介绍如何正确地使用try、catch和throw进行异常处理。 七、实践应用 ...
C++课程设计——课程设计宾馆客房管理系统(源代码+课设报告+详细注释) 实现功能如下: 1、输入用户名和密码 2、选择服务类型: ①订房;②入住;③退房;④查询; 本系统设置了80个房间,其中房间分四个等级,每...
c++趣味入门——扫雷
第1章 android平台上的c++入门 1 第2章 深入了解androidndk 35 第3章 用jni实现与原生代码通信 57 第4章 使用swig自动生成jni代码 81 第5章 日志、调试及故障处理 111 第6章 bionic api入门 135 第7章 原生线程 155 ...
图书管理系统使用C++编写的,适用人群学生,同学可以借鉴其内容,实现增删改查功能。如发现有错误,请在评论区指出,谢谢
- 009.PDF和007.PDF可能涉及C++的内存管理和异常处理,这是理解和编写高效、安全代码的关键。 通过阅读这些PDF,读者可以逐步理解C++的各个重要方面,并提升编程能力。同时,书中还可能包含实际编程案例和练习,以...
c++小板接球——多球版.cpp
总结来说,"C++课程设计——通讯录源程序"是一个极好的学习实践,涵盖了C++语言的基础和高级特性,包括面向对象编程、文件操作、异常处理和内存管理等多个方面。通过这个项目,你将能够巩固理论知识,提升编程实践...
本书是Ford和Topp两位教授于1996年出版的名著Data Structures with C++的第2版,新版中引入了在ANSI C 1998中正式规定的标准模板库(STL)来讲授数据结构,在全球范围内已经有数以万计的学生从中受益。 作者将C++...
基于C++实现FFT ——数字信号处理 ,现成的序列有:正弦 三角 矩形 采样
新智能指针,包括`std::unique_ptr`、`std::shared_ptr`和`std::weak_ptr`,提供了自动内存管理的能力,帮助避免内存泄漏。 本地方面(locale)被用于格式化和处理不同文化特定的表示问题,如日期、时间和货币等。...