c内存管理详解(doc27)-经营管理(编辑修改稿)内容摘要:

见示例。 char *GetMemory3(int num) { char *p = (char *)malloc(sizeof(char) * num)。 return p。 } void Test3(void) { char *str = NULL。 中国最大的管理资料下载中心 (收集 \整理 . 部分版权归原作者所有 ) str = GetMemory3(100)。 strcpy(str, hello)。 cout str endl。 free(str)。 } 示例 用函数返回值来传递动态内存 用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把 return语句用错了。 这里强调不要用 return 语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例。 char *GetString(void) { char p[] = hello world。 return p。 // 编译器将提出警告 } void Test4(void) { char *str = NULL。 中国最大的管理资料下载中心 (收集 \整理 . 部分版权归原作者所有 ) str = GetString()。 // str 的内容是垃圾 cout str endl。 } 示例 return 语句返回指向“栈内存”的指针 用调试器逐步跟踪 Test4,发现执行 str = GetString 语句后 str不再是 NULL指针,但是 str 的内容不是“ hello world”而是垃圾。 如果把示例 改写成示例 ,会怎么样。 char *GetString2(void) { char *p = hello world。 return p。 } void Test5(void) { char *str = NULL。 str = GetString2()。 中国最大的管理资料下载中心 (收集 \整理 . 部分版权归原作者所有 ) cout str endl。 } 示例 return 语句返回常量字符串 函数 Test5 运行虽然不会出错,但是函数 GetString2 的设计概念却是错误的。 因为 GetString2 内的“ hello world” 是常量字符串,位于静态存储区,它在程序生命期内恒定不变。 无论什么时候调用 GetString2,它返回的始终是同一个“只读”的内存块。 杜绝“野指针” “ 野指针”不是 NULL 指针,是指向“垃圾”内存的指针。 人们一般不 会错用 NULL 指针,因为用 if 语句很容易判断。 但是“野指针”是很危险的, if语句对它不起作用。 “ 野指针”的成因主要有两种: ( 1)指针变量没有被初始化。 任何指针变量刚被创建时不会自动成为NULL 指针,它的缺省值是随机的,它会乱指一气。 所以,指针变量在创建的 中国最大的管理资料下载中心 (收集 \整理 . 部分版权归原作者所有 ) 同时应当被初始化,要么将指针设置为 NULL,要么让它指向合法的内存。 例如 char *p = NULL。 char *str = (char *) malloc(100)。 ( 2)指针 p 被 free 或者 delete 之后,没有置为 NULL, 让人误以为 p是个合法的指针。 ( 3)指针操作超越了变量的作用范围。 这种情况让人防不胜防,示例程序如下: class A { public: void Func(void){ cout “Func of class A” endl。 } }。 void Test(void) 中国最大的管理资料下载中心 (收集 \整理 . 部分版权归原作者所有 ) { A *p。 { A a。 p = amp。 a。 // 注意 a 的生命期 } pFunc()。 // p 是“野指针” } 函数 Test 在执行语句 pFunc()时,对象 a 已经消失,而 p 是指向 a的,所以 p 就成了“野指针”。 但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。 有了 malloc/free 为什么还要 new/delete。 malloc 与 free是 C++/C语言的标准库函数, new/delete 是 C++的运算符。 它们都可用于申请动态内存和释放内存。 中国最大的管理资料下载中心 (收集 \整理 . 部分版权归原作者所有 ) 对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。 对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。 由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。 因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。 注意 new/delete 不是库函数。 我们先看一看 malloc/free 和 new/delete如何实现对象的动态内存管理,见示例 6。 class Obj { public : Obj(void){。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。