如何在你的C/C++代码中避免、发现(修复)内存错误

内存错误一般都是焦聚在c和c++应用程序中,而且它会直接影响到应用程序的稳定性和正确性。这些错误都是源于程序在设计时的bug。这种错误很难重现,难于排除,并且要正确修正要花费高昂的代价。应用程序如果有内存错误定会遭受极大的问题。例如,内存泄漏会导致该应用程序耗尽内存,直接的结果是程序的异常终止。本文的主要目的是在多线程程序中理解富有挑战性的内存错误。

    内存错误可以主要分为堆内存错误和栈内存错误。下面是一些主要内存错误:

    1. 非法访问堆、栈内存。

    2. 内存泄漏。

    3. 分配和释放内存配合不当。(allocation/deallocation)

    4.  忘记分配内存。

     5. 访问没有初始化的堆、栈内存。

     6.  越界访问内存。   

 

非法内存访问

  这个错误出现在对未分配的或已经释放的内存进行读或写的操作。

例如:

  char *pStr = (char *) malloc(25);

  free(pStr);

  strcpy(pStr, .parallel parogarmming.);  //这里就是非法对已经释放的堆内存进行写操作。    

 

内存泄漏

   内存泄漏主要是因为内存分配了但是相应的没有释放对应的内存。假如这种内存泄漏足够多的频繁发生,那么最终会引起应用程序耗尽内存,最终导致程序提前终止(异常终止)。

例如:

    char *pStr = (char*) malloc(512);

     return ;   //只malloc,而不free

忘记分配内存

    这种错误一般发生在对已经被释放的内存进行再次释放。同时也叫做重复释放或双重释放。

例如:

     char* pStr = (char*) malloc(20);

     free(pStr);

     free(pStr);         // 导致非法内存释放。

访问未初始化的内存

     这种类型的内存错误主要是发生在读取没有初始化的变量在程序中。

例如:

       char  *pStr = (char*) malloc(512);

       char  c = pStr[0];   // 这里pStr的值没有初始化。

 void func()

{

         int a;

         int b = a + 4;     //读取的a没有初始化值。

}

为了避免这种错误,通常是采用在使用前(定义时)对变量进行初始化。

跨越栈内存访问

这种错误主要发生在在不同的线程中有线程访问栈内存。

例如:

main()

{

    int *p;

    /* ------------------- */

    CreateThread(., thread #1, .);   //自身拥有的栈

     CreateThead(., thread #2, .);

   /* -------------------- */

}

 

Thread #1

{

     int q[1024];

     p = q;

     q[0] = 1;

}

Thread #2

{

     *p = 2;          // 栈内存跨越访问

}

最容易避免这种错误的方法是避免保存全局变量的栈地址。

 

                                              By Naveen Gv

原文:http://cprogramming.com/tutorial/memory_debugging_parallel_inspector.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值