关于在类中使用指针的问题(C++Builder)(100分)

  • 主题发起人 主题发起人 zhxyzht
  • 开始时间 开始时间
Z

zhxyzht

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个文件中定义了一个类,在类中动态创建一个字符型指针。在另一个文件中使用它,
创建及第一次调用都正常,但第二次调用时,该指针所指内容则完全改变了。
请高手不吝赐教。
 
贴简单代码,和相关调用方法
 
第二次调用,是不是第二次 new 的过程啊,否则,大家指向一个地址,当然要改掉啊
 
OK!

在Capfile.h中
class TCapfile : public TObject
{
private: // User declarations
Longint blen;
int readint(char *buff,Longint *li,int max);
int readln(char *obuff,char *sbuff);
public:
char *Buf;
int errornum;
__fastcall TCapfile(String filename);
__fastcall TCapfile(char *buff,int bufflen);
__fastcall ~TCapfile();
int __fastcall readtgn(Longint position,char *tgn,char *times,char *dates,Longint datas[29]);
int __fastcall readdestid(Longint position,char *destid,char *times,char *dates,Longint datas[15]);
};



在Capfile.cpp中
__fastcall TCapfile::TCapfile(String filename)
{
blen=0;
int RHand=FileOpen(filename, fmOpenRead);
if (RHand==-1)
{
errornum=-1;
return;
}
Longint FLen = FileSeek(RHand,0,2);
Buf = new char[FLen+1];
FileSeek(RHand,0,0);
blen = FileRead(RHand, Buf, FLen);
FileClose(RHand);
errornum=0;
}
__fastcall TCapfile::TCapfile(char *buff,int bufflen)
{
blen=0;
Buf = new char[bufflen+1];
StrCopy(Buf, buff);
blen=bufflen;
errornum=0;
}

在dy.cpp中调用

TCapfile *fff=new TCapfile("D://020223.cap");

Longint i=0,ll;
Longint mb1[29],mb2[15];
char dates1[8],dates2[8],tgn1[4],destid1[8],times1[2],times2[2];
i=fff->readtgn(i,tgn1,times1,dates1,mb1);
i=fff->readdestid(i,destid1,times2,dates2,mb2);
delete fff;

注意在初始化类fff时fff->Buf正常。
调用readtgn结束前Buf也正常,但调用readdestid时Buf指向的内容为????。
 
i=fff->readtgn(i,tgn1,times1,dates1,mb1);
i=fff->readdestid(i,destid1,times2,dates2,mb2);
关键是这两句话吧,你所说的第二次调用应该是下一个函数,而第一次试上一个函数
你去看看再第一个函数
i=fff->readtgn(i,tgn1,times1,dates1,mb1);
都做了什么?
 
关键是readdestid干了什么?
 
ft,你不会自己跟踪一下吗?什么时候改变了指针的值都不知道???
 
同意lvxq的看法,看readtgn(i,tgn1,times1,dates1,mb1);readdestid(i,destid1,times2,dates2,mb2);

干了什么,也可以把这两个函数的具体实现贴出来
 
对于类之内的变量成员的分配,
最好在同一个初始化过程中实现。

你在两个构造中各自分配了 buf 的内存这很容易造成错误,可以改为:
class TCapfile : public TObject
{
private:
void AllocBuffer(const size_t size = 255);
...
};

__fastcall TCapfile::TCapfile(String filename)
{
AllocBuffer(filename.Length());

blen=0;
int RHand=FileOpen(filename, fmOpenRead);
if (RHand==-1)
{
errornum=-1;
return;
}
Longint FLen = FileSeek(RHand,0,2);
//Buf = new char[FLen+1];
FileSeek(RHand,0,0);
blen = FileRead(RHand, Buf, FLen);
FileClose(RHand);
errornum=0;
}
__fastcall TCapfile::TCapfile(char *buff,int bufflen)
{
AllocBuffer(buflen)

blen=0;
//Buf = new char[bufflen+1];
StrCopy(Buf, buff);
blen=bufflen;
errornum=0;
}

void TCapFile::AllocBuffer(const size_t size)
{
if (size > blen)
{
delete[] Buf;
blen = size;
buf = new char[blen +1];
}
}


 
问题找到了,多谢!
 
后退
顶部