zoukankan      html  css  js  c++  java
  • Debug正常编译运行但Release版报错分析

    遇到DEBUG成功的版本RELEASE 就有问题,以下是问题的分析总结

    1. 变量未初始化。

        下面的程序在debug中运行的很好。

    thing * search(thing * something)
    BOOL found;
    for(int i = 0; i < whatever.GetSize(); i++)
    {
        if(whatever[i]->field == something->field)
        {
            found = TRUE;
            break;
        }
    }
    if(found)
        return whatever[i];
    else
        return NULL;


        而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。


    2. 数据溢出的问题
    如:
    char buffer[10];
    int counter;
    lstrcpy(buffer, "abcdefghik");
          在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。


    3. DEBUG版和RELEASE版的内存分配方式是不同的 。

        如果你在DEBUG版中申请 ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。


    4. 内存分配
         保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。


    5. DLL的灾难
          人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) ,甚至微软自己也这么说(http://msdn.microsoft.com/library/techart/dlldanger1.htm)。
    如果你的程序使用你自己的DLL时请注意:
    1. 不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。
          解决办法是将debug和release的程序分别放在主程序的debug和release目录下
    2. 千万不要以为静态连接库会解决问题,那只会使情况更糟糕。

  • 相关阅读:
    Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)
    yii2权限控制rbac之rule详细讲解(转)
    Yii2提交表单提示无法验证
    php 数组排序以及按照某个字段排序
    Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
    Yii2的深入学习--自动加载机制(转)
    YII2 自定义日志路径
    Yii2-Redis使用小记
    windows下安装php5.5的redis扩展
    php json_decode返回null
  • 原文地址:https://www.cnblogs.com/publiter/p/13298527.html
Copyright © 2011-2022 走看看