经典的笔试题解析:内存泄漏问题忘记free与非法访问的问题

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 经典的笔试题解析:内存泄漏问题忘记free与非法访问的问题

请各位老铁欣赏一下,下面的简短代码:


1.内存泄漏问题忘记free!!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void getmemory(char** p, int num)
{
  *p = (char*)malloc(num);
}
void test()
{
  char* str = NULL;
  getmemory(&str, 100);
  strcpy(str, "hello world");
  printf("%s\n", str);
  //忘记释放
}
int main()
{
  test();
  return 0;
}


上述的代码,并没有多少错误,只不过就是忘记释放掉malloc开辟的空间罢了!!!


不过当运行一个较大的程序的时候,每次都申请空间而不去释放,可能会导致内存不足,从而……卡机!!!所以一定不要忘记释放动态内存开辟的空间!!!


0a2653c851af460fa595bd959398a8f1.png


2.非法访问问题!!


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void test()
{
  char* str = (char*)malloc(100);
  strcpy(str, "hello");
  free(str);  //在这里,已经释放掉str了!!
  if (str != NULL)
  {
  //str此时为野指针!
  //在这里进行非法访问!
  strcpy(str, "world");
  printf("%s\n", str);
  }
}
int main()
{
  test();
  return 0;
}


对于这个代码,在函数没有结束就已经使用:free(str); free完以后,malloc函数开辟的100个字节的空间,已经还给操作系统了,且str指针不会自动置为NULL(空指针)!!故此时,str为野指针!!!在后面进行strcpy(str, "world")拷贝的时候,就会进行非法访问!!


温馨小提示:


free完以后,一定要将指针置为NULL(空指针),否则这个指针,就为空指针!!


相关文章
|
5天前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
28天前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
45 1
|
1月前
|
C++
【C++】深入解析C/C++内存管理:new与delete的使用及原理(二)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
1月前
|
编译器 C++ 开发者
【C++】深入解析C/C++内存管理:new与delete的使用及原理(三)
【C++】深入解析C/C++内存管理:new与delete的使用及原理
|
21天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理方式,特别是垃圾回收机制。我们将了解Java的自动内存管理是如何工作的,它如何帮助开发者避免常见的内存泄漏问题。通过分析不同垃圾回收算法(如标记-清除、复制和标记-整理)以及JVM如何选择合适的垃圾回收策略,本文旨在帮助Java开发者更好地理解和优化应用程序的性能。
|
27天前
|
程序员 编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(下)
动态内存分配与管理详解(附加笔试题分析)(下)
44 2
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
126 1
|
1月前
|
存储 安全 Java
JVM锁的膨胀过程与锁内存变化解析
在Java虚拟机(JVM)中,锁机制是确保多线程环境下数据一致性和线程安全的重要手段。随着线程对共享资源的竞争程度不同,JVM中的锁会经历从低级到高级的膨胀过程,以适应不同的并发场景。本文将深入探讨JVM锁的膨胀过程,以及锁在内存中的变化。
34 1
|
29天前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
60 0
|
1月前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-16-内存管理 解析内存状态
MacOS环境-手写操作系统-16-内存管理 解析内存状态
31 0

推荐镜像

更多