内存学习(二)内存溢出介绍以及解决思路

一、内存溢出定义

指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory,通常出现在某一块内存空间耗尽的时候

二、内存溢出原因

  1. 内存中加载的数据量过于庞大,例如给 int 整型变量赋予了 long 类型的数据
  2. 代码中存在死循环
  3. 内存分配未成功,却继续使用,可以在使用内存之前检查指针是否为 NULL 进行判断
  4. 内存分配成功,但是未初始化就引用它
  5. 内存分配成功,初始化后有对变量的引用,使用完后未释放
  6. 内存分配成功,初始化后,操作变量越过了内存的边界

三、常见的一些内存溢出风险

3.1 strcpy 函数

函数原型:char strcpy(char dest, const char *src);
函数功能:把从 src 地址开始且含有 NULL 结束符的字符串复制到 dest 地址
函数说明:src 和 dest 指向内存区域不可以重叠;dest 必须有足够的空间来容纳 src 的字符串
备注:当 src 的长度大于 dest 分配到的空间,就会出现内存溢出,应当使用 strncpy 避免

3.2 sprintf函数

函数原型:int sprintf(char *buffer, const char *format, [argument]…);
函数功能:格式化字符串,将格式化的数据写入字符串指针 buffer 中
备注:当写入的数据长度比 buffer 的内存空间大,则会导致内存溢出,应当尽量使用snprintf避免

3.3 malloc函数

使用 malloc 函数,需要释放内存空间,还要将原先的指针变量赋予一个 NULL 空指针,如果忘记赋予 NULL 会导致原先的指针变量成为了一个野指针,没有明确指向,系统不知道它会指向什么地方

calloc函数就不需要手动赋予 NULL,是因为在每次调用完calloc函数的时候系统会自动将原先的指针赋予一个空指针

猜你喜欢

转载自blog.csdn.net/future_sky_word/article/details/125830572