C++ Debug错误

Love AI 2009-06-15 04:22:10
我编写的一个小程序,运行时出现如下的错误提示
Debug Error!
Program: ........\XXX.exe
DAMAGE: after Normal block(#11310) at 0xXXXXXXXX
我通过debug发现错误出现在下面语句处:

free( n_stack );//n_stack是一个unsigned long型数组

出现这种错误的原因是什么啊?
...全文
556 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhony_lee 2009-06-16
  • 打赏
  • 举报
回复
是不是free同一段内存两次啊?
dl591944556 2009-06-16
  • 打赏
  • 举报
回复
越界了
free用多了
passionboy03 2009-06-16
  • 打赏
  • 举报
回复
内存非配是否成功?判断一下
[Quote=引用 4 楼 JLU_Leven 的回复:]
引用 3 楼 mmoaay 的回复:
就这一条语句啊,没有其他的信息很难判断诶,楼主


它所在的函数如下

C/C++ code
extern BDD * BDD_Build( Clause_Set * cls )
{
BDD * bdd = NEW( BDD, 1 );
BDD_Init( bdd, cls->num_var, 0, 0 );
int * d_stack = NEW( int, cls->num_var );
unsigned int num_d_stack = 0;
unsigned long * n_stack = NEW( unsigned long, cls->num_var + 1 );
unsigned…
[/Quote]
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 goodname 的回复:]
我反复看了好几遍,头发晕。

从给出的错误来看,像越界了。

你可以多加几个assert来拦截一下。
[/Quote]
如果被释放内存的话,结果是对的.
要不我把程序传给你,你帮我调一下啊.不过得在VC下,我准备移到linux下,可能还得改动一些地方,好像true和false都会被警告,for(int i = 0;;)也不被允许.
goodname 2009-06-15
  • 打赏
  • 举报
回复
我反复看了好几遍,头发晕。

从给出的错误来看,像越界了。

你可以多加几个assert来拦截一下。
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 longfei_007 的回复:]
你这个NEW是自定义的一个new操作把,那么应该有对应的free封装函数才对。
如你函数杀过所些的你实用自定义的NEW,用系统的free。本身就存在编程规范问题
你应把你的NEW函数【或者NEW宏】贴出来。
或者自己检查下进行new对应的free操作
[/Quote]
已经贴出,见9楼
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 goodname 的回复:]
这种一段的程序只用眼看很难看出问题来。

while ( num_d_stack > 0 && d_stack[num_d_stack - 1] < 0 ) {
BDD_Un_Assign( cls, -d_stack[num_d_stack - 1], false );
num_d_stack--;
num_n_stack--;
n_stack[num_n_stack - 1] = BDD_Node_Build( bdd, \ // <--注意这个地方,如果
Var( -d_stack[num_d_stack] ), n_stack[num_n_stack - 1], \
n_stack[num_n_stack] );
}

如果在while处num_d_stack == 1符合循环条件…
[/Quote]
呵呵,你看得真仔细.
实际上,只要进入循环,就能保证num_n_stack >= 1.
这个函数是递归程序改过来的,使用递归程序会出现栈溢出.最后结果保存在n_stack[0]处.
pysjp 2009-06-15
  • 打赏
  • 举报
回复
一下还看不出来,帮楼主顶了
longfei_007 2009-06-15
  • 打赏
  • 举报
回复
你这个NEW是自定义的一个new操作把,那么应该有对应的free封装函数才对。
如你函数杀过所些的你实用自定义的NEW,用系统的free。本身就存在编程规范问题
你应把你的NEW函数【或者NEW宏】贴出来。
或者自己检查下进行new对应的free操作
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 WG_Wolf 的回复:]
把错误信息贴全了~
这样都不明白~
[/Quote]
没有错误信息,运行错误!
goodname 2009-06-15
  • 打赏
  • 举报
回复
这种一段的程序只用眼看很难看出问题来。

while ( num_d_stack > 0 && d_stack[num_d_stack - 1] < 0 ) {
BDD_Un_Assign( cls, -d_stack[num_d_stack - 1], false );
num_d_stack--;
num_n_stack--;
n_stack[num_n_stack - 1] = BDD_Node_Build( bdd, \ //<--注意这个地方,如果
Var( -d_stack[num_d_stack] ), n_stack[num_n_stack - 1], \
n_stack[num_n_stack] );
}

如果在while处num_d_stack == 1符合循环条件,则num_d_stack--;后为0,下面你再n_stack[num_n_stack - 1]
即为n_stack[-1]可能会出问题。



看这东西,很累。
WG_Wolf 2009-06-15
  • 打赏
  • 举报
回复
在VC++编译环境下,如果你内存操作越界,free的时候会出问题。好好查查你的逻辑!
WG_Wolf 2009-06-15
  • 打赏
  • 举报
回复
把错误信息贴全了~
这样都不明白~
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 caixin99 的回复:]
用vector
[/Quote]
想用纯C编写
caixin99 2009-06-15
  • 打赏
  • 举报
回复
用vector
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ameyume 的回复:]
C/C++ codeint*d_stack=NEW(int, cls->num_var );
unsignedintnum_d_stack=0;
unsignedlong*n_stack=NEW( unsignedlong, cls->num_var+1);
...
free( d_stack );
free( n_stack );

你前面用的NEW申请内存,后面用free释放不匹配,应该用DELETE释放
[/Quote]
NEW是我定义的宏

#define NEW( Name, num ) ( Name * ) malloc( num * sizeof( Name ) );
ameyume 2009-06-15
  • 打赏
  • 举报
回复
int * d_stack = NEW( int, cls->num_var );
unsigned int num_d_stack = 0;
unsigned long * n_stack = NEW( unsigned long, cls->num_var + 1 );
...
free( d_stack );
free( n_stack );


你前面用的NEW申请内存,后面用free释放不匹配,应该用DELETE释放
Love AI 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ameyume 的回复:]
C中:malloc申请内容,free释放内存
C++:new申请内存,delete释放内存
[/Quote]
ameyume 2009-06-15
  • 打赏
  • 举报
回复
C中:malloc申请内容,free释放内存
C++:new申请内存,delete释放内存
ameyume 2009-06-15
  • 打赏
  • 举报
回复
只有malloc申请的内存才用free释放,如果只是定义一个unsigned long型数组不需要执行free
加载更多回复(4)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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