刚学了学api编程,写了一个小程序,debug版本的运行正常,然而release版本的却似乎陷入了死循环,搞得win2000说内存不够。但是我在debug版本调试的时候我一条一条语句的跟,应该没有问题,内存释放也很正确,而且debug运行一点毛病也没有。是不是vc编译器有问题?哪位大哥遇到过类似的问题,给点线索,谢了。

解决方案 »

  1.   

    以前问过类似的问题,众兄弟告我的,希望能给你一点帮助!下面是一点转载:debug里有调试信息,release没有,也就是说release下编译的程序不能设断点调试,release下生成的文件要比debug下生成的文件小release版本是比较安全的版本release 和 debug 的不同点:
    1、release 没有 debug information & symbols,比如每段code对应的源文件名和行号。
    2、release 不包含 MFC 的诊断代码,如 Assert, Dump 以及相关的宏都不会被编译。
    3、relesse 被大幅度优化,(debug 生成的二进制代码严格的符合源代码),比如:
    for(int i = 0; i < 16; i++)
    string[i] = '\0';
    编译成:
    __asm {
    xor eax,eax
    mov dword ptr [string],eax
    mov dword ptr [string+4],eax
    mov dword ptr [string+8],eax
    mov dword ptr [string+12],eax
    }
      

  2.   

    See the two nice articles below, very useful ,FYI :http://www.codeproject.com/debug/releasemode.asp
    http://www.codeproject.com/debug/survivereleasever.asp
      

  3.   

    代码没有问题,而且代码比较长,大致结构是这样的:
    A *p,*plast;
    p = malloc(sizeof(A));
    for(;;;)
    {
       ....
       plast = malloc(sizeof(A));
       ....
       p->next = plast;
       //fputs(filehandle, "....");
       ....
    }
    if(p!=NULL)
    {
    递归释放空间,并置指针为NULL;
    }这种结构很简单啊。而且特别奇怪的是,因为release没有调试信息,我回家在代
    码中加了那个写文件的操作,当作调试信息,程序就没有问题了。去掉后还是老毛
    病。
      

  4.   

    看了qing_li73(bluemoon)给的链接文章,把优化选项改成其他的(缺省的是最大速优化)就可以了。看来还是编译器在优化的时候的问题。可是为什么我加上写文件的操作就没有问题呢?是不是这条语句把编译器对这部分代码的优化打乱了?呵呵,瞎想的。