`
weiyinchao88
  • 浏览: 1234411 次
文章分类
社区版块
存档分类
最新评论

踏入C++中的雷区——C++内存管理详解(IV)

 
阅读更多
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程序库导论》是一本深度探讨C++开发中的Boost库的专著。Boost库是C++社区公认的扩展标准库,它包含了大量的高效、高质量的可重用C++组件,旨在提升C++的灵活性、效率和可移植性。这本书面向...

    C++课程设计——个人财务管理

    C++课程设计——个人财务管理,作为大学课程设计挺不错的,希望对大家有帮助。

    数据结构 C++语言描述——应用标准模板库(STL)(第2版)源代码

    本书是Ford和Topp两位教授于1996年出版的名著Data Structures with C++的第2版,新版中引入了在ANSI C 1998中正式规定的标准模板库(STL)来讲授数据结构,在全球范围内已经有数以万计的学生从中受益。 作者将C++...

    《Android C++高级编程——使用NDK》_源码.zip

    主要内容:● 使用JNI将原生代码连接到Java中● 使用SWIG自动生成JNI代码● 使用POSIX线程实现多线程应用● 使用POSIX套接字实现网络应用● 使用logging、GDB和Eclipse调试器进行调试● 使用Valgrind分析内存● 使用...

    C++课程设计——学生管理系统

    【C++课程设计——学生管理系统】是一个典型的面向对象编程项目,旨在帮助学习者掌握C++语言在实际问题解决中的应用,特别是数据管理与系统设计。在这个项目中,学生管理系统是用C++实现的一个小型数据库系统,它...

    C++课件完整——包含C++全部内容

    7. **第八章 对象生灭.ppt** - 这部分可能会深入探讨对象的生命周期,包括动态内存管理(new和delete操作)、栈与堆的区别,以及智能指针的使用,防止内存泄漏。 8. **第九章 继承.ppt** - 继承是面向对象编程的三...

    《C++语言描述——数据结构算法与应用》

    理解内存管理是避免程序错误的关键,书中会讨论动态内存分配、指针操作以及内存泄漏等问题。此外,异常处理是确保程序健壮性的重要手段,书中会介绍如何正确地使用try、catch和throw进行异常处理。 七、实践应用 ...

    C/C++课程设计——课程设计宾馆客房管理系统(源代码+课设报告+详细注释).zip

    C++课程设计——课程设计宾馆客房管理系统(源代码+课设报告+详细注释) 实现功能如下: 1、输入用户名和密码 2、选择服务类型: ①订房;②入住;③退房;④查询; 本系统设置了80个房间,其中房间分四个等级,每...

    c++趣味入门——扫雷

    c++趣味入门——扫雷

    Android C++高级编程——使用NDK完整版

    第1章 android平台上的c++入门 1 第2章 深入了解androidndk 35 第3章 用jni实现与原生代码通信 57 第4章 使用swig自动生成jni代码 81 第5章 日志、调试及故障处理 111 第6章 bionic api入门 135 第7章 原生线程 155 ...

    C++课程设计——图书管理系统.txt

    图书管理系统使用C++编写的,适用人群学生,同学可以借鉴其内容,实现增删改查功能。如发现有错误,请在评论区指出,谢谢

    c++编程思想——介绍

    - 009.PDF和007.PDF可能涉及C++的内存管理和异常处理,这是理解和编写高效、安全代码的关键。 通过阅读这些PDF,读者可以逐步理解C++的各个重要方面,并提升编程能力。同时,书中还可能包含实际编程案例和练习,以...

    c++小板接球——多球版.cpp

    c++小板接球——多球版.cpp

    C++课程设计——通讯录源程序

    总结来说,"C++课程设计——通讯录源程序"是一个极好的学习实践,涵盖了C++语言的基础和高级特性,包括面向对象编程、文件操作、异常处理和内存管理等多个方面。通过这个项目,你将能够巩固理论知识,提升编程实践...

    数据结构 C++语言描述——应用标准模板库(STL)(第2版)源代码 .net版

    本书是Ford和Topp两位教授于1996年出版的名著Data Structures with C++的第2版,新版中引入了在ANSI C 1998中正式规定的标准模板库(STL)来讲授数据结构,在全球范围内已经有数以万计的学生从中受益。 作者将C++...

    基于C++实现FFT ——数字信号处理

    基于C++实现FFT ——数字信号处理 ,现成的序列有:正弦 三角 矩形 采样

    C++标准库——自学教程与参考手册

    新智能指针,包括`std::unique_ptr`、`std::shared_ptr`和`std::weak_ptr`,提供了自动内存管理的能力,帮助避免内存泄漏。 本地方面(locale)被用于格式化和处理不同文化特定的表示问题,如日期、时间和货币等。...

Global site tag (gtag.js) - Google Analytics