工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1909|回复: 4

VC6.0 运行时出错

[复制链接]
发表于 2006-6-6 19:56 | 显示全部楼层 |阅读模式
出错提示:
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句  
  1. for(i=0;i<SIZE;i++){
  2.         free(--dp1);
  3.         free(dp1++);
  4.     }
复制代码

dp1,dp2的申请函数:

  1. double * init(){
  2.     double * dp;
  3.     if((dp=(double *)malloc(SIZE*sizeof(double)))==NULL){
  4.         printf("Can\'t malloc!");
  5.     }
  6.     return dp;
  7. }
复制代码


刚开始用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作为参数传递进去。

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

使用道具 举报

发表于 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 ...

    应该不是这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-15 01:57

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表