【请教】VC2005 release下如何断点调试?

north00 2008-04-03 08:08:56
在我的程序里,有部分数据是存放在数组里的,这些数组变量是通过new出来的动态数组,在debug和release的条件下发现得到的结果居然不一样,所以想请教高手VC2005在release下如何断电调试,谢谢~
...全文
760 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
north00 2008-04-04
  • 打赏
  • 举报
回复
请高手们给点宝贵的建议啊~
用户 昵称 2008-04-04
  • 打赏
  • 举报
回复
检查是否为NULL就可以了。

if( NULL == 变量 )
没new成功
north00 2008-04-04
  • 打赏
  • 举报
回复
To:qiqi5521
我对所有的数组变量都用MessageBox做报告测试了,没有出现问题,还有我在debug下花了一个晚上用手算了几个例子,都显示debug下算的是正确结果,但是release下的运算结果就明显错了


TO:jennyvenus
如何能看出每一个new都成功了?我在debug下用断点跟踪发现都成功了啊~ release下如何发现是否成功??


谢谢大家热心帮助.....
用户 昵称 2008-04-04
  • 打赏
  • 举报
回复
你得确定每一个 new都成功了,你这样光new没检测。
qiqi5521 2008-04-04
  • 打赏
  • 举报
回复
看你的代码,如果
0 <= x <= dim_X-1
0 <= y <= dim_Y-1
就不越界,否则的话,用MessageBox报告
qiqi5521 2008-04-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 north00 的回复:]
楼上的兄弟,我是新手,请详细点说:

1. 如何对数组在访问时做索引越界检查?

2. 变量初始化应该就是我6楼中第2步中的写法吧?

3. VC2005在哪里关闭Release的速度优化??

我很晕..
[/Quote]

1、访问数组的时候确认一下下标是否在正确范围内。可用ASSERT(),Debug下调试。用MessageBox报告也行,Release下也可报告。
2、6楼的代码应该是没有问题的
3、在【项目】【属性】【配置属性】【C/C++】【优化】选“禁用”即可。该方法是掩盖问题,着急交货的话可以用用。强烈不推荐。
qiqi5521 2008-04-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 north00 的回复:]
高手们给个意见啊~~
我所有动态产生的数组都是如下操作的:

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…
[/Quote]

你给的这部分代码是没有问题的。不要再把眼光放在这里了。
north00 2008-04-04
  • 打赏
  • 举报
回复
我按16楼那样写的,没有出现Access violation的错误

其他地方的错误仍在继续挖掘中,快崩溃了~~
jingzhongrong 2008-04-04
  • 打赏
  • 举报
回复
如果你按16楼那样写的话出现Access violation基本就是指针使用有问题,在数组初始化这里没有问题。

Debug没有错误不代表就没有错误,只不过你没有发现而已

不要把视线都放在数组初始化这里,
north00 2008-04-04
  • 打赏
  • 举报
回复
楼上的兄弟,我是新手,请详细点说:

1. 如何对数组在访问时做索引越界检查?

2. 变量初始化应该就是我6楼中第2步中的写法吧?

3. VC2005在哪里关闭Release的速度优化??

我很晕..
qiqi5521 2008-04-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 north00 的回复:]
debug模式下完全找不到错误啊
结果是指我程序的其他函数里的运算结果嘛,而且运算结果是存在float型数组里的,上面说的st1数组是结构体类型的数组,在运算过程中使用到的,保存的结果不是st1里的内容
[/Quote]

debug编译没有错误不代表程序没有错误,运行没有错误也不代表程序没有错误。Debug和Release编译出的代码不一样,内存分配布局也不一样,对代码错误的表现也不一样。

建议你尝试如下措施:
1、尽可能在数组访问的时候加上索引越界检查。
2、变量,特别是指针变量要初始化。
3、如果以上措施都不见效,那么关闭Release的速度优化试一下。
north00 2008-04-04
  • 打赏
  • 举报
回复
TO:jingzhongrong

用mmset跟没有用效果一样的啊,在release下得不到正确得结果...
north00 2008-04-04
  • 打赏
  • 举报
回复
st里面包含几个int型的数组
jingzhongrong 2008-04-04
  • 打赏
  • 举报
回复

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结构是什么呢
north00 2008-04-04
  • 打赏
  • 举报
回复
TO:jingzhongrong
按照你在12楼的做法后,在debug下调试没有出错,但是在运行的时候有错误指向其他函数中的st1,并且弹出错误提示框如下:
Unhandled exception at 0x004190bc in FLP.exe: 0xC0000005: Access violation reading location 0x00000000.
cofanz 2008-04-04
  • 打赏
  • 举报
回复
在编译选项里选上编译时生成.map及.cod文件,这样出错时可以根据堆栈信息可以找到具体的某一行代码。
如果你的程序没有出错堆栈信息,可以使用drwatson。
north00 2008-04-04
  • 打赏
  • 举报
回复
TO:jingzhongrong
按照你8楼提供的写法在析构时报错的,我刚才试过了,你意思是不是最好用下面的写法?

for(int i=0;i <dim_Y;i++)
delete st1[i];
delete []st1;
jingzhongrong 2008-04-04
  • 打赏
  • 举报
回复
你试试在new出每一个st结构后用
memset(&st,0,sizeof(st))
jingzhongrong 2008-04-04
  • 打赏
  • 举报
回复
汗……看错……真是不好意思

可能是其他问题吧

delete []st1这句还是这样写好
north00 2008-04-04
  • 打赏
  • 举报
回复
TO:jingzhongrong
二维数组是这样释放内存吗?? 怀疑唉...
加载更多回复(8)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧