如下错误通常是如何导致的?(高分求解)

AeLord 2003-08-05 06:43:38
Access violation at address 40037E17 in module 'rtl60.bpl'. Read of address 00000010.
分数不是问题,只要能解决问题,拜托给位兄弟姐妹!
...全文
28 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
AeLord 2003-08-06
  • 打赏
  • 举报
回复
老大,我的本意可能没有说明白,能把邮址告诉我吗?我把源程序给你看!
AeLord 2003-08-06
  • 打赏
  • 举报
回复
我终于发现自己的错误所在了,正如季大哥所说,其实我在这里犯了一个笔误,却把自己害得这么惨,最后再次感谢各位!
qibo999 2003-08-06
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) 说的有道理。

代码没仔细看,不过这种错误一般都是非法访问内存、指针越界引起的,建议你先用CodeGuard查一下。
jishiping 2003-08-06
  • 打赏
  • 举报
回复
DIARY_INFO_FILE::Save_To_File 中的下面2行有问题:
Filename=new char[sizeof(File_Name)+1];
strcpy(Filename, File_Name);
由于 File_Name 的类型为 const char*, 所以 sizeof(File_Name) 的值在Win32下
始终为4,这儿的 sizeof(File_Name) 应该改成 strlen(File_Name)
jishiping 2003-08-05
  • 打赏
  • 举报
回复
也不知道楼主是否看明白上面说的。简化一点说,对于构造函数DIARY_INFO_FILE::
DIARY_INFO_FILE(const char *File_Name)来说,如果File_Name不为空,并且指向的文件
存在的话,那么它里面调用Load_From_File(Filename);时,在函数Load_From_File里面,
参数File_Name就是Filename,就是说此时调用函数Load_From_File里的下面3行代码时,
delete [] Filename; // 此时就是删除了File_Name指向的内存,而下面2行
// 又访问File_Name指向的内存块,就会发生Access
// violation
Filename=new char[strlen(File_Name)+1];
strcpy(Filename, File_Name);
jishiping 2003-08-05
  • 打赏
  • 举报
回复
没有细看,只是看了上面一点点,就发现问题很多。
DIARY_INFO_FILE::DIARY_INFO_FILE()
{
Filename=new char[1];
*Filename='\0';
File_Head=new DIARY_INFO_FILE_HEAD;
Load_From_File(Filename);
}
这儿Filename只有一个字节,它的内容为空,此时调用Load_From_File(Filename);有什么
用?接着看下面的代码:


bool DIARY_INFO_FILE::Load_From_File(const char *File_Name)
{
FILE *fp=fopen(File_Name, "rb");
if (fp)
{
delete [] Filename;
Filename=new char[strlen(File_Name)+1];
strcpy(Filename, File_Name);
fread(File_Head, sizeof(DIARY_INFO_FILE_HEAD), 1, fp);
fclose(fp);
return true;
}
else
{
return false;
}
}
在上面的 DIARY_INFO_FILE() 中,调用Load_From_File函数,由于此时的File_Name指向的
内容为空,所以这个函数里,fp 肯定为NULL,直接返回false。如果前面写对了,File_Name
指向的内容不为空的话,那么这儿File_Name就是指向Filename。如果fp不为NULL的话,代码
delete [] Filename;就是删除了File_Name指向的内存空间,此时再访问strlen(File_Name)
当然就会出现楼主说的现象(Access violation)。所以对于构造函数DIARY_INFO_FILE::
DIARY_INFO_FILE()来说,它里面的Load_From_File(Filename);根本就是多余的,但是对于
构造函数DIARY_INFO_FILE::DIARY_INFO_FILE(const char *File_Name)来说,它里面调用
Load_From_File(Filename);就肯定会发生Access violation的错误。
starstargao 2003-08-05
  • 打赏
  • 举报
回复
出现上面的问题主要是
对不存在的对象或结构进行了操作
starstargao 2003-08-05
  • 打赏
  • 举报
回复
stargu_1@163.com
starstargao 2003-08-05
  • 打赏
  • 举报
回复
你把代码发给我,我帮你看看
AeLord 2003-08-05
  • 打赏
  • 举报
回复
无人问津...
AeLord 2003-08-05
  • 打赏
  • 举报
回复
小弟其实是在做一个自由软件(日记本)代码一编了一半了,而且文件似乎操作也可以正确进行,就是往往在关闭程序后突然就弹出上述出错对话框!如那位老兄不惜宝贵时间,小弟愿意奉上全部代码,以供指正!
albeta 2003-08-05
  • 打赏
  • 举报
回复
用CodeGuard看看,有没有内存泄漏先
albeta 2003-08-05
  • 打赏
  • 举报
回复
原因太多了,有时候,长时间的运行CBuilder,也会报这个错。通常,跟访问内存有关系。
AeLord 2003-08-05
  • 打赏
  • 举报
回复
小弟初步确定应该与如下代码有关(编译可以通过,且无任何警告信息):

下面为Diary_Struct.cpp源码
//---------------------------------------------------------------------------


#pragma hdrstop

#include "Diary_Struct.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)
//---------------------------------------------------------------------------
DIARY_INFO_FILE *diary_info=NULL;
DIARY_INFO_FILE::DIARY_INFO_FILE()
{
Filename=new char[1];
*Filename='\0';
File_Head=new DIARY_INFO_FILE_HEAD;
Load_From_File(Filename);
}

DIARY_INFO_FILE::DIARY_INFO_FILE(const char *File_Name)
{
if (strlen(File_Name)==0)
{
Filename=new char[1];
*Filename='\0';
}
else
{
Filename=new char[strlen(File_Name)+1];
strcpy(Filename, File_Name);
}
File_Head=new DIARY_INFO_FILE_HEAD;
Load_From_File(Filename);
}

DIARY_INFO_FILE::~DIARY_INFO_FILE()
{
delete File_Head;
delete [] Filename;
}

bool DIARY_INFO_FILE::Load_From_File(const char *File_Name)
{
FILE *fp=fopen(File_Name, "rb");
if (fp)
{
delete [] Filename;
Filename=new char[strlen(File_Name)+1];
strcpy(Filename, File_Name);
fread(File_Head, sizeof(DIARY_INFO_FILE_HEAD), 1, fp);
fclose(fp);
return true;
}
else
{
return false;
}
}

bool DIARY_INFO_FILE::Save_To_File(const char *File_Name, const DIARY_INFO_FILE_HEAD *Head, const DIARY_INFO_FILE_BODY_NODE *Body)
{
if (strlen(File_Name)==0)
{
return false;
}
delete Filename;
Filename=new char[sizeof(File_Name)+1];
strcpy(Filename, File_Name);
FILE *fp=fopen(Filename, "wb");
if (fp)
{
File_Head->Sex =Head->Sex ;
strcpy(File_Head->Name, Head->Name );
strcpy(File_Head->Password, Head->Password );
strcpy(File_Head->Nick_Name, Head->Nick_Name );
strcpy(File_Head->Identity_Number, Head->Identity_Number );
strcpy(File_Head->Company_Name, Head->Company_Name );
strcpy(File_Head->Company_Address, Head->Company_Address );
strcpy(File_Head->Company_Telephone, Head->Company_Telephone );
strcpy(File_Head->Home_Address, Head->Home_Address );
strcpy(File_Head->Home_Telephone, Head->Home_Telephone );
strcpy(File_Head->Mobile, Head->Mobile );
strcpy(File_Head->Email, Head->Email );
strcpy(File_Head->Homepage, Head->Homepage );
strcpy(File_Head->QQ_Number, Head->QQ_Number );
strcpy(File_Head->ICQ_Number, Head->ICQ_Number );
strcpy(File_Head->Personal_Love, Head->Personal_Love );
fwrite(File_Head, sizeof(DIARY_INFO_FILE_HEAD), 1, fp);
fclose(fp);
return true;
}
else
{
return false;
}
}

bool DIARY_INFO_FILE::Get_Head_Info(DIARY_INFO_FILE_HEAD *Head_Info)
{
if (Is_File_Empty())
{
return false;
}
Head_Info->Sex =File_Head->Sex ;
strcpy(Head_Info->Name , File_Head->Name );
strcpy(Head_Info->Password , File_Head->Password );
strcpy(Head_Info->Nick_Name , File_Head->Nick_Name );
strcpy(Head_Info->Identity_Number , File_Head->Identity_Number );
strcpy(Head_Info->Company_Name , File_Head->Company_Name );
strcpy(Head_Info->Company_Address , File_Head->Company_Address );
strcpy(Head_Info->Company_Telephone , File_Head->Company_Telephone );
strcpy(Head_Info->Home_Address , File_Head->Home_Address );
strcpy(Head_Info->Home_Telephone , File_Head->Home_Telephone );
strcpy(Head_Info->Mobile , File_Head->Mobile );
strcpy(Head_Info->Email , File_Head->Email );
strcpy(Head_Info->Homepage , File_Head->Homepage );
strcpy(Head_Info->QQ_Number , File_Head->QQ_Number );
strcpy(Head_Info->ICQ_Number , File_Head->ICQ_Number );
strcpy(Head_Info->Personal_Love , File_Head->Personal_Love );
return true;
}

bool DIARY_INFO_FILE::Get_Body_Info(DIARY_INFO_FILE_BODY_NODE **Body_Info)
{
if (Is_File_Empty())
{
return false;
}
return true;
}

bool DIARY_INFO_FILE::Is_File_Empty()
{
return (strlen(Filename)>0)?false:true;
}




//下面为Diary_Struct.h源码

//---------------------------------------------------------------------------

#ifndef Diary_StructH
#define Diary_StructH
#include <stdio.h>
#include <string.h>
//---------------------------------------------------------------------------
enum SEX_INFO{MALE, FEMALE};

struct DIARY_INFO_FILE_BODY_NODE
{
char *Current_Content;
unsigned long Current_Size;
DIARY_INFO_FILE_BODY_NODE *Next;
};

struct DIARY_INFO_FILE_HEAD
{
SEX_INFO Sex;
char Name[20];
char Password[20];
char Nick_Name[20];
char Identity_Number[18];
char Company_Name[20];
char Company_Address[50];
char Company_Telephone[20];
char Home_Address[50];
char Home_Telephone[20];
char Mobile[20];
char Email[50];
char Homepage[80];
char QQ_Number[20];
char ICQ_Number[20];
char Personal_Love[200];
};

class DIARY_INFO_FILE
{
public:
DIARY_INFO_FILE();
DIARY_INFO_FILE(const char *File_Name);
~DIARY_INFO_FILE();
bool Load_From_File(const char *File_Name);
bool Save_To_File(const char *File_Name, const DIARY_INFO_FILE_HEAD *Head, const DIARY_INFO_FILE_BODY_NODE *Body);
bool Is_File_Empty();
bool DIARY_INFO_FILE::Get_Head_Info(DIARY_INFO_FILE_HEAD *Head_Info);
bool DIARY_INFO_FILE::Get_Body_Info(DIARY_INFO_FILE_BODY_NODE **Body_Info);
private:
char *Filename;
DIARY_INFO_FILE_HEAD *File_Head;
DIARY_INFO_FILE_BODY_NODE *Current_Node;
};

extern DIARY_INFO_FILE *diary_info;
#endif

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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