常见内存错误的几点总结

学习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、申请和释放量不匹配:申请了多少内存,在使用完毕后就要释放多少。

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

时间: 2024-10-07 19:07:43

常见内存错误的几点总结的相关文章

C语言常见内存错误

C语言指针和内存泄露 常见的内存错误: 1.      内存分配未成功却使用了它. 如果指针p是函数的参数,要在函数的入口处用assert(p!=NULL)进行检查: 如果是用malloc来动态申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理. 2.      内存分配成功,尚未初始化就使用它. 3.      内存分配成功并且初始化,但操作越界. 例如在使用数组时经常发生"多1"或"少1"操作. 4.      忘记释放内存造成内存泄露.

大内高手—常见内存错误

转自:http://blog.chinaunix.net/uid-23228758-id-4355524.html 随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器.这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见. 而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题.而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱.前事不忘,后世之师,了解这些常见的错误,在编程时就

[草稿][C语言][内存分配]常见内存错误

1. 使用未分配成功的内存 解决案: ①在使用内存前检查指针是否为NULL ②参数是指针时,在函数入口处用assert进行判断 ③如果指针指向动态申请的内存,用if进行容错处理 2. 使用分配成功,但未初始化的内存 解决案: ①定义数组后一定要初始化 3. 内存泄漏 解决案: ①new/malloc和delete/free一定要成对出现 4. 使用已被释放的内存 解决按: ①不要返回指向栈内存的指针或引用 ②释放内存后,将指针置为NULL

C语言中常见的内存错误与解决方法

常见的错误 关于内存的一些知识已在内存分配中提及,现记录与分享常见的内存错误与对策. 类型 1:内存未分配成功,却使用了它. 方   法:在使用之前检查指针是否为NULL. 1)当指针p是函数的参数时,在函数入口处用语句assert(p!=NULL)进行断言检查. 2)当使用malloc或new来申请内存时,应该用if(p != NULL)进行防错检查. 类型 2:引用了尚未初始化的指针 原   因:内存的缺省初始值究竟是什么并没有统一的标准,在使用之前都进行初始化. 1)没有初始化的观念. 2

常见动态内存错误---内存泄漏

常见动态内存错误 编译器不能自动发现动态内存错误,动态内存错误通常只能在程序运行时才能被捕捉到,而且错误原因不容易查找,错误本身也不容易捕捉,改错难度较大. 1.动态内存分配失败却继续操作 内存不足等有可能导致动态内存分配失败,所以使用new请求分配动态内存后一定要检查返回地址是否为NULL. 如用if(p==NULL) 或 if(p!=NULL)进行检查,未检查前不要操作动态内存空间. 2.动态内存空间未初始化就进行读操作 C++标准并未规定动态内存空间的默认值,程序无法预知该默认值的具体指.

iOS开发 两个内存错误的一般处理方法

本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dxlj.html 由于iOS5.0之前没有自动应用计数机制,也没有Java那样的垃圾回收功能.我们都需要自己管理和控制对象的回收,这是一件很麻烦的事情,也是做iOS项目中最容易出现的问题.如果不掌握这些方法,调试这些问题几乎没有头绪. 1.EXC_BAD_ACCESS内存错误与NSZombieEnabledEXC_BAD_ACCESS是最常见的错误了,这个一般是访问了释放了的内存地址空间造成的.比

PHP编程中10个最常见的错误

PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. 错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法: 1 2 3 4 5 $arr = array(1, 2, 3, 4); foreach ($arr as &$value) {     $value = $value * 2; } // $arr

Java千百问_04异常处理(008)_java中常见的错误有哪些

点击进入_更多_Java千百问 java中常见的错误有哪些 想了解异常看这里:什么是java中的异常 常见的运行时异常看这里:常见的Java异常有哪些(运行时) 常见的非运行时异常看这里:常见的java异常有哪些(非运行时) java中除了异常Exception之外,还有一大类错误,即ERROR,我们常见的ERROR如下: 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 对系统所访问外部资源,未执

iOS 开发中常见的错误日志处理

Outline如何获得crash日志如何解析crash日志如何分析crash日志     1. iOS策略相关     2. 常见错误标识     3. 代码bug 一.如何获得crash日志 当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上.这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人员定位问题很有帮助. 如果设备就在身边,可以连接设备,打开Xcode - Window - Organizer,在左侧面板