关于内存管理实例
2023-09-27 14:27:45 时间
1 void GetMemory(char *p) 2 { 3 p = (char*)malloc(100); 4 } 5 6 void Test(void) 7 { 8 char *str = NULL; 9 GetMemory(str); 10 strcpy(str, "helloworld"); 11 printf(str); 12 } 13 14 运行Test函数会有什么样的结果? 15 答: 16 程序崩溃;原因:1、实参是通过拷贝的方式 17 传递给行参的;str本身的值依旧是存放 18 了NULL的地址(程序头的空白地址); 19 2、malloc之后没有释放内存; 20 21 char *GetMemory(void) 22 { 23 char p[] = "hello world"; 24 return p; 25 } 26 27 void Test(void) 28 { 29 char *str = NULL; 30 str = GetMemory(); 31 printf(str); 32 } 33 运行Test函数会有什么样的结果? 34 答:打印乱码,原因:1、p字符串数组的空间是在栈上 35 开辟的,函数执行完之后,该空间释放了; 36 str指向了“栈内存”,不是NULL,但数据不存在了; 37 第23行,与char* p = "hello world"; 38 有本质的不同;(此处,p指向静态数据区,函数 39 中这样做没有问题) 40 2、printf访问栈内存,很可能存的是垃圾值。 41 42 void GetMemory(char **p, int num) 43 { 44 *p = (char*)malloc(num); 45 } 46 47 void Test(void) 48 { 49 char *str = NULL; 50 GetMemory(&str, 100); 51 strcpy(str, "hello"); 52 printf(str); 53 } 54 55 56 运行Test函数会有什么样的结果? 57 答:能正常输出,但是malloc没有free,内存泄露; 58 注意:值传递(任何时候,参数传递都是拷贝形式); 59 void Test(void) 60 { 61 char* str = (char*)malloc(100); 62 strcpy(str, "hello"); 63 free(str); 64 if(str!=NULL) 65 { 66 strcpy(str, "world"); 67 printf(str); 68 } 69 } 70 运行Test函数会有什么样的结果? 71 答:篡改动态内存区的内容。后果难以确定; 72 因为free(str)之后,str成为野指针;
str仍有指向原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。
因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。
73 if(str!=NULL)语句不起作用;
相关文章
- 调整SQLServer最大服务器内存参数后实例停止且无法启动
- UWA学堂课程推荐:深度剖析PersistentManager.Remapper内存占用
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
- C/C++——程序的内存分配
- C语言中的内存分配与释放
- Java并发JUC(java.util.concurrent)JMM内存模型
- 【jvm系列-06】深入理解对象的实例化、内存布局和访问定位
- 从Container内存监控限制到CPU使用率限制方案
- C++类实例以及子类在内存中的分配
- Android中如何查找内存泄露
- 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
- Oracle内存详解之二 Library cache 库缓冲-转载
- Android内存回收机制
- (1.1)学习笔记之mysql体系结构(内存、进程、线程)