程序崩溃--内存访问及申请释放

1 篇文章 0 订阅
1 篇文章 0 订阅

程序的编写过程中,经常会出现程序崩溃的问题,而这类问题大多数是因为对内存的处理不当引起的,而且不好找出原因,现将遇到的问题总结如下,以便日后查找:

1、内存的访问过界

这类问题只要写程序时注意一些就可以避免,但是如果出现问题,也是不容易的找出的,主要出现在使用指针访问数组或动态申请的内存时出现,为了防止此问题出现,在使用指针访问内存时,一定要加一个长度限制。

例:

int a[10];
int *b=a;
for(int i=0;i<10;++i)
{
printf("%d ",*b++);
}

int len=200;
int *a=new int[len];
int *b = a;
for(int i;i<len;++i)
{
printf("%d ",*b++);
}


2、内存溢出

我的理解是其本质和内存访问过界相仿,都是访问了没有申请的内存。这种问题一般出现在,向内存中写数据时,如将较大的串复制给较小的串。这种问题应该是比较常见的,一般是因为预先申请的内存不足。

解决这类问题有三种方法:

a、使用动态申请内存,写数据前先计算使用的内存大小,然后再申请足够大的内存,写入。
这种方法如果写入比较频繁的话,效率会很低。

b、预设内存,数据太长,截取数据。
这种方法会造成部分数据的丢失,但是处理简单。

c、先预设一定长度的内存,内存不足时,再申请一块内存补上,(相当于自己写一个内存管理的小程序)


3、内存泄漏

这种问题比较多,而且最不好找到问题所在,这就需要写程序时一定要注意,申请了内存一定要释放掉。(或借用其他的工具调试)


4、内存重复释放

这种问题也不容易找出,经常让人感觉莫名其妙,而且原因也不容易重现,一般出现在“全局变量”上。为了避免这种问题,在释放内存时,要先判断指针是否为空,并且释放后一定要将指针重置为空。

例:

if(p)
{
delete p;
p=NULL;
}


注:在写程序时,避免频繁的申请和释放内存,不然程序很容易死掉,尤其是长期运行的程序!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值