在我的程序里,有部分数据是存放在数组里的,这些数组变量是通过new出来的动态数组,在debug和release的条件下发现得到的结果居然不一样,所以想请教高手VC2005在release下如何断电调试,谢谢~

解决方案 »

  1.   

    一般来说Debug模式才是用来调试的,Release不要进行调试。
    有时候在Release模式下调试会发现有乱码的,而且程序的跳转也不正常。这2种模式的编译模式不一样,
    Debug更宽松些。
    如果设断点跟代码还是到Debug下吧。
      

  2.   

    楼上得兄弟,我也知道这个道理,但是我想破头皮还找不出问题
    只要是通过new方法生成的变量我都初始化了啊,按理来说不会有问题的,但是在release下的结果明显出错了而debug下就可以正常得到结果
      

  3.   

    高手们给个意见啊~~
    我所有动态产生的数组都是如下操作的:1.在头文件里:
      st** st1;
    2.在构造函数里:
      st1=new st*[dim_X];                 //dim_X是第一维的长度
      for(int i=0;i<dim_X;i++)   
        st1[i]=new st[dim_Y];        //dim_Y是第二维的长度3.在析构函数里
      for(int i=0;i<dim_X;i++)   
        delete[] st1[i];                 //dim_Y是第二维的长度
      delete st1;4. 在我的程序其他函数中使用st1数组。
    /////////////////////////////////////////////////////////debug下完全正确,一release过后产生的结果就有错误!!
       
     
      

  4.   

    结果不一样是指什么,
    也有可能是指针越界操作什么的最好在Debug模式下面调试
      

  5.   

    析构的时候有问题吧for(int i=0;i <dim_Y;i++)delete []st1
      

  6.   

    debug模式下完全找不到错误啊
    结果是指我程序的其他函数里的运算结果嘛,而且运算结果是存在float型数组里的,上面说的st1数组是结构体类型的数组,在运算过程中使用到的,保存的结果不是st1里的内容
      

  7.   

    TO:jingzhongrong 
    二维数组是这样释放内存吗?? 怀疑唉...
      

  8.   

    汗……看错……真是不好意思可能是其他问题吧delete []st1这句还是这样写好
      

  9.   

    你试试在new出每一个st结构后用
    memset(&st,0,sizeof(st))
      

  10.   

    TO:jingzhongrong 
    按照你8楼提供的写法在析构时报错的,我刚才试过了,你意思是不是最好用下面的写法?for(int i=0;i  <dim_Y;i++) 
      delete st1[i];
    delete []st1;  
      

  11.   

    在编译选项里选上编译时生成.map及.cod文件,这样出错时可以根据堆栈信息可以找到具体的某一行代码。
    如果你的程序没有出错堆栈信息,可以使用drwatson。
      

  12.   

    TO:jingzhongrong  
    按照你在12楼的做法后,在debug下调试没有出错,但是在运行的时候有错误指向其他函数中的st1,并且弹出错误提示框如下:
    Unhandled exception at 0x004190bc in FLP.exe: 0xC0000005: Access violation reading location 0x00000000.
      

  13.   


    st1=new st*[dim_X];             //dim_X是第一维的长度 
    for(int i=0;i <dim_X;i++) 
    {   
    st1[i]=new st[dim_Y];        //dim_Y是第二维的长度
    for(int j = 0; j < dim_Y; j++)
    memset(&st1[i][j],0,sizeof(st)); 
    }
    析构
    for(int i=0;i   <dim_X;i++)  
    delete []st1[i]; 
    delete []st1; 你的st结构是什么呢
      

  14.   

    TO:jingzhongrong   用mmset跟没有用效果一样的啊,在release下得不到正确得结果...
      

  15.   


    debug编译没有错误不代表程序没有错误,运行没有错误也不代表程序没有错误。Debug和Release编译出的代码不一样,内存分配布局也不一样,对代码错误的表现也不一样。建议你尝试如下措施:
    1、尽可能在数组访问的时候加上索引越界检查。
    2、变量,特别是指针变量要初始化。
    3、如果以上措施都不见效,那么关闭Release的速度优化试一下。
      

  16.   

    楼上的兄弟,我是新手,请详细点说:1. 如何对数组在访问时做索引越界检查?2. 变量初始化应该就是我6楼中第2步中的写法吧?3. VC2005在哪里关闭Release的速度优化??我很晕..
      

  17.   

    如果你按16楼那样写的话出现Access violation基本就是指针使用有问题,在数组初始化这里没有问题。Debug没有错误不代表就没有错误,只不过你没有发现而已不要把视线都放在数组初始化这里,
      

  18.   

    我按16楼那样写的,没有出现Access violation的错误其他地方的错误仍在继续挖掘中,快崩溃了~~
      

  19.   


    1、访问数组的时候确认一下下标是否在正确范围内。可用ASSERT(),Debug下调试。用MessageBox报告也行,Release下也可报告。
    2、6楼的代码应该是没有问题的
    3、在【项目】【属性】【配置属性】【C/C++】【优化】选“禁用”即可。该方法是掩盖问题,着急交货的话可以用用。强烈不推荐。
      

  20.   

    看你的代码,如果
    0 <= x <= dim_X-1
    0 <= y <= dim_Y-1
     就不越界,否则的话,用MessageBox报告
      

  21.   

    你得确定每一个 new都成功了,你这样光new没检测。
      

  22.   

    To:qiqi5521 
    我对所有的数组变量都用MessageBox做报告测试了,没有出现问题,还有我在debug下花了一个晚上用手算了几个例子,都显示debug下算的是正确结果,但是release下的运算结果就明显错了
    TO:jennyvenus 
    如何能看出每一个new都成功了?我在debug下用断点跟踪发现都成功了啊~ release下如何发现是否成功??
    谢谢大家热心帮助.....
      

  23.   

    检查是否为NULL就可以了。if( NULL == 变量 )
    没new成功