恶魔大叔 发表于 2006-6-6 19:56

VC6.0 运行时出错

出错提示:

Debug Assertion Failed!

Program:F:\kechen\cc作业\debug\ex.exe
File:dbgheap.c

Expression:_CrtIsValidHeapPointer(pUserData)

For information on how your program can cause an assertion
failure,see the Visual C++ document on asserts.

(press Retry to debug the application)

出错的语句在:
for 和 ++--都没有错误的(之前有语句调用,并改变dp1 dp2的指针)
调试设断点在free句
for(i=0;i<SIZE;i++){
      free(--dp1);
      free(dp1++);
    }
dp1,dp2的申请函数:

double * init(){
    double * dp;
    if((dp=(double *)malloc(SIZE*sizeof(double)))==NULL){
      printf("Can\'t malloc!");
    }
    return dp;
}

刚开始用VC不知是哪出错了……
在TC++3.0生成的EXE文件运行不会出错,
VC生成的EXE文件运行后却出错。。。

用程序诠释生命 发表于 2006-6-6 21:20

dp是在init()里面声明的,于是它在init结束的时候它的生命周期也就结束的,也就是当你返回dp的时候,已经是一个“未定义”的地址。所以你进行free的时候会发生错误。
你应该把dp1在外部定义,然后把init改成void init( double* dp ), 在init里面分配地址空间,把dp1作为参数传递进去。

(根据我看的书的理论分析的结果是这样的,本身没有出现过这种错误,不敢确定对,不过你可以试试)

找个恐龙当GF 发表于 2006-6-6 22:27

楼主那个free(--dp1);和free(dp1++)是做什么的?
如果要释放dp1的空间直接free(dp1)就好了

恶魔大叔 发表于 2006-6-7 01:05

--dp1是因为前面对dp1进行了操作…………

在TC++3.0中没有问题……问题不是dp1--    ……

恶魔大叔 发表于 2006-6-7 01:07

原帖由 用程序诠释生命 于 2006-6-6 21:20 发表
dp是在init()里面声明的,于是它在init结束的时候它的生命周期也就结束的,也就是当你返回dp的时候,已经是一个“未定义”的地址。所以你进行free的时候会发生错误。
你应该把dp1在外部定义,然后把init改成void ...
    应该不是这个问题
页: [1]
查看完整版本: VC6.0 运行时出错