博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见内存错误的几点总结
阅读量:6283 次
发布时间:2019-06-22

本文共 1092 字,大约阅读时间需要 3 分钟。

学习C语言以来一直没有注意到细节的控制,敲代码总是“无所顾忌”的。如今慢慢把程序写大写复杂了。在资源宝贵和的嵌入式中。这个问题越来越须要注意了——内存的管理。。让编程慢慢走上正轨,慢慢走上可预见性吧,慢慢与机器融为一体,慢慢习惯于如梁肇新前辈所说以机器的思维方式思维吧!!!

1、返回局部变量地址将引起内存错误
2、暂时空间过大:操作系统在载入某个应用程序时,都将为其分配一定大小的栈空间,若申请过大的局部变量。可能会引起栈溢出问题。

(PC机上Windows和Linux系统一般不必操心这个,由于有虚拟内存机制。但嵌入式开发就要特别注意这个了——资源有限,一旦栈溢出造成程序错误又是非常难查的~~~)

3、src 和 dst 内存覆盖:在进行字节内存复制时,常会出现这一问题。由于部分系统库函数并没有提供内存覆盖的检測功能,从而导致错误。

例如以下即是源内存区和目的内存区覆盖的演示样例:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc ,char *argv[])
{
    char x[50];
    int i;
    for(i=0;i<50; i++)   x[i]=i ;
    strncpy(x+20 ,x ,20)  ;//把 x地址开头的20个字节拷贝到以 x+20 开头的内存空间内  ,能够
    strncpy(x+20 ,x ,21) ;//把x地址开头的21个字节拷贝到以x+20开头的内存空间内, 目的内存区被覆盖了一个字节
    x[39]='\o';  // 在此截断数据段
    strcpy(x ,x+20) ; //把 x+20 开头到 x+39这20个字节拷贝到以 x地址开头的内存空间,能够
    x[39]=40 ;
    x[40]='\o' ;//在此截断数据段
    strcpy(x ,x+20) ;//把 x+20开头到 x+40这21个字节拷贝到以 x地址开头的内存空间。目的内存空间有被覆盖一字节
    return 0 ;
}
4、动态内存管理错误
    动态申请的堆内存空间须要自己管理
1、申请和释放不一致:因为C++兼容C,而C与C++的内存申请和释放方式不一样,因此在C++程序中。就有两套动态内存管理函数。

正常应该是採用C方式申请就用C方式释放,用C++申请的就要用C++方式释放

2、申请和释放量不匹配:申请了多少内存,在使用完毕后就要释放多少。

若果没有释放或者少释放了就是内存泄露。多释放了也会产生问题。(尽管程序退出后系统会回收堆空间。但严格的应该申请的堆空间要在程序中释放掉。

转载地址:http://ysxva.baihongyu.com/

你可能感兴趣的文章
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>
js 判断整数
查看>>
建设网站应该考虑哪些因素
查看>>
mongodb $exists
查看>>
js实现页面跳转的几种方式
查看>>