在VS平台上能通过,并算出结果,直接用生成的exe就会停止工作

diwen0330 2013-11-24 10:58:20
这是什么个情况呀,检查了一天了也没找到问题所在,请问一般是什么原因造成的?
...全文
206 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-11-25
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
diwen0330 2013-11-25
  • 打赏
  • 举报
回复
上面漏了几行
	for (int i=0;i<row;i++)
	{
                int N=0;
		for(int j=0;j<15;j++)
		{
			if (data[i][j]!=0)
				N++;
			j=j+2;
		}
		double** ab;
		ab=(double **)malloc(sizeof(double)*N);
		for(int p=0;p<N;p++)
			ab[p]=(double*)malloc(3*sizeof(double));
		double *dc=(double*)malloc(sizeof(double)*N);
		int K=0;
		for(int j=0;j<15;j++)
		{
			if (data[i][j]!=0)
			{
				ab[K][0]=data[i][j];
				ab[K][1]=data[i][j+1];
				ab[K][2]=1;
				dc[K]=-data[i][j+2];
				K++;
			}
			j=j+2;
		}
                ……
                ……
		for(int p=0;p<N;p++)
			{free(ab[p]);ab[p]=NULL;}
		free(ab);
		for(int p=0;p<N;p++)
		free(dc);
}
错误就发生在结尾处
diwen0330 2013-11-25
  • 打赏
  • 举报
回复
我发现问题一直出在第二个循环结束时,而第一个循环是可以正常运行的 而反汇编则指在最后一个free()函数处,add esp,4 在堆栈顶端推出4个字节,也就是说释放数组的时候出问题了,我将其中的许多函数都删了还是有这个问题,请大家看一下哪边有问题,
		double** ab;
		ab=(double **)malloc(sizeof(double)*N);
		for(int p=0;p<N;p++)
			ab[p]=(double*)malloc(3*sizeof(double));
 		double *dc=(double*)malloc(sizeof(double)*N);
		int K=0;
		for(int j=0;j<15;j++)
		{
			if (data[i][j]!=0)
			{
				ab[K][0]=data[i][j];
				ab[K][1]=data[i][j+1];
				ab[K][2]=1;
				dc[K]=-data[i][j+2];
				K++;
			}
			j=j+2;
		}
Sky丶Memory 2013-11-25
  • 打赏
  • 举报
回复
代码中存在潜在的BUG
xiaohuh421 2013-11-25
  • 打赏
  • 举报
回复
多打日志出来看, 不调试模式下, 可输出日志到文件, 更可以输出到DebugView中.调用OutputDebugString函数即可.
Adol1111 2013-11-25
  • 打赏
  • 举报
回复
这个是运行时错误,一般是指针错误造成的,比较常见的把变量值做地址赋给指针,或者是数组越界,段错误什么的。从你的描述来说,也可能是访问了malloc数组以外的部分(越界了),要么是free的首地址变了,造成的堆破坏。你再检查下?
diwen0330 2013-11-25
  • 打赏
  • 举报
回复
谢谢楼上各位的帮助,虽然暂时还没有解决,但总算多了一些方法 另外我改了一些代码,出现了以下错误,不知如何解决,指向数组的指针和指针数组我一向很头大 不能将参数 1 从“double (*)[3]”转换为“double **”; 不能将参数 1 从“double [3][3]”转换为“double **”
diwen0330 2013-11-24
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
代码有问题呗!严重依赖vs环境
应该和里面的OPENCV变量有关,我在一个循环里动态申请了一个数组,然后给这个数组赋值,并用这个数组给一个CvMat赋值,然后进行运算(其实是因为OPENCV处理矩阵比较方便),一次循环结束时回收内存的时候是不是就冲突了呢?
max_min_ 2013-11-24
  • 打赏
  • 举报
回复
代码有问题呗!严重依赖vs环境
relaxisland 2013-11-24
  • 打赏
  • 举报
回复
这个猜谜语啊 是不是需要访问外部文件,路径什么的不对?

64,648

社区成员

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

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