`
lingyibin
  • 浏览: 196305 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

高质量C++/C编程学习笔记(四)----- 内存管理(2)

阅读更多

5、用指针参数传递内存

用指针作为函数的参数,如果去申请动态内存的话,是不会成功的。

void GetMemory(char *p, int num) 
{ 
 p = (char *)malloc(sizeof(char) * num); 
} 
void Test(void) 
{ 
 char *str = NULL; 
 GetMemory(str, 100); // str  仍然为 NULL  
 strcpy(str, "hello"); //  运行错误 
} 

  问题出在函数 GetMemory 中。编译器总是要为函数的每个参数制作临时副本,指针参数 p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p 的内容,就导致参数 p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是 p 丝毫未变。所以函数 GetMemory并不能输出任何东西。事实上,每执行一次 GetMemory 就会泄露一块内存,因为没有用free 释放内存。。。

但我们可以试着用双重指针去实现:

void GetMemory2(char **p, int num) 
{ 
 *p = (char *)malloc(sizeof(char) * num); 
} 
void Test2(void) 
{ 
 char *str = NULL; 
 GetMemory2(&str, 100); //  注意参数是 &str,而不是 str 
 strcpy(str, "hello");  
 cout<< str << endl; 
 free(str);  
} 

 或者用函数返回值:

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);  
} 

 但这里要注意一点,就是不要返回栈内存:

char *GetString(void) 
{ 
 char p[] = "hello world"; 
 return p; //  编译器将提出警告 
} 

 如果写成:

char *GetString2(void) 
{ 
 char *p = "hello world"; 
 return p; 
} 

 那么返回的是一个静态存储区内的内存块,只读的。

 

6、动态内存会被自动释放吗?

 void Func(void) 
{ 
 char *p = (char *) malloc(100); //  动态内存会自动释放吗?
} 
 我们要注意, 指针有一些“似是而非”的特征: 

(1)指针消亡了,并不表示它所指的内存会被自动释放。 

(2)内存被释放了,并不表示指针会消亡或者成了 NULL 指针。

当程序运行终止时,一切相关的指针都会消亡,但这也要小心,如果不释放内存或者不把没用的指针设空的话,当这段程序被别人引用时,谁也不知道会发生什么事。

 

7、注意“野指针”,它的危害也挺大的。

它不等于NULL,所以if语句对它根本没什么作用。所以当你用if(p != NULL) 判断后就直接使用这个野指针,那就会报错。程序中止。“野指针”不等于NULL,它指向内存的一些垃圾块。

它的产生主要有以下几个方面:

(1)指针变量没有被初始化。(2)指针 p 被 free 或者 delete 之后,没有置为 NULL。(3)指针操作超越了变量的作用范围。

 

8、new出来的对象数组,用delete[] objects; 来释放。用delete objects; 时只删掉了一个,其它的都泄漏了。。。

0
2
分享到:
评论

相关推荐

    高质量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++编程学习笔记.doc

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

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

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

    (强烈推荐大家看一看)高质量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 技术详解 #### 一、泛型编程概述 泛型编程是一种编程范式,通过在程序设计中使用参数化的类型来编写代码,使得同一段代码可以处理多种不同的数据类型。这种编程方式极大...

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

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

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

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

    高质量C++编程指南

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

    Cocos2D-X2.2.3学习笔记3(内存管理)

    总结来说,理解和掌握Cocos2D-X的内存管理对于开发高质量的游戏至关重要。通过正确使用对象生命周期、内存分配与释放、引用计数以及智能指针,可以有效地避免内存泄漏,提升游戏性能,确保玩家的良好体验。

    c/c++编程思想

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics