动态指针数组该如何进行内存动态分配及内存释放?
以下是我自己编写的一些代码,在进行动态指针数组释放的时候总是提示错误,请各位大虾给予指正,谢谢!!!
从 标注有这里的这里的这行开始,第一次释放成功,可是进行第2次[1][1]释放就出错
procedure TForm1.aDDnodeClick(Sender: TObject);
const
ID_CLASS =DWORD($80000001);
ID_STUDENT=DWORD($80000002);
type
PBirthDay=^TBirthDay;
TBirthDay=Record
rYear: String[4];
rMonth: String[2];
rDay: String[2];
end;
PStudent=^TStudent;
TStudent=Record
rLevel: DWORD;
rStuID: String[7];
rClass: String[5];
rNumber: String[2];
rName: String[6];
rBirthDay: PBirthDay;
end;
PClass=^TClass;
TClass=Record
rLevel: DWORD;
rClassID: String[5];
rClassName: String[10];
rStuCount: Integer;
rMaster: PStudent;
rStudents: Array of PStudent;
end;
function CopyStu(aSrcStu, aDecStu: PStudent): Integer;
begin
aDecStu.rLevel:=aSrcStu.rLevel;
aDecStu.rStuID:=aSrcStu.rStuID;
aDecStu.rClass:=aSrcStu.rClass;
aDecStu.rNumber:=aSrcStu.rNumber;
aDecStu.rName:=aSrcStu.rName;
aDecStu.rBirthDay.rYear:=aSrcStu.rBirthDay.rYear;
aDecStu.rBirthDay.rMonth:=aSrcStu.rBirthDay.rMonth;
aDecStu.rBirthDay.rDay:=aSrcStu.rBirthDay.rDay;
Result:=0;
end;
function CopyClass(aSrcClass, aDecClass: PClass): Integer;
var
i: integer;
begin
aDecClass.rLevel:=aSrcClass.rLevel;
aDecClass.rClassID:=aSrcClass.rClassID;
aDecClass.rClassName:=aSrcClass.rClassName;
aDecClass.rStuCount:=aSrcClass.rStuCount;
CopyStu(aSrcClass.rMaster, aDecClass.rMaster);
for i:=1 to aSrcClass.rStuCount do
begin
try
CopyStu( PStudent(aSrcClass.rStudents[i]), PStudent(aDecClass.rStudents[i]) );
except
end;
end;
Result:=0;
end;
var
CurNode, ClsNode, StuNode: TTreeNode;
newCls : PClass;
newStu : PStudent;
newClss: array of PClass;
newStus: array of PStudent;
i, j: Integer;
begin
newCls:=AllocMem( SizeOf(TClass) );
newCls.rMaster:=AllocMem( SizeOf(TStudent) );
newCls.rMaster.rBirthDay:=AllocMem( SizeOf(TBirthDay) );
SetLength(newCls.rStudents, 2);
for i:=1 to 2 do
begin
PStudent(newCls.rStudents[i]):=AllocMem( SizeOf(TStudent) );
PStudent(newCls.rStudents[i]).rBirthDay:=AllocMem( SizeOf(TBirthDay) );
end;
SetLength(newClss, 2);
for i:=1 to 2 do
begin
PClass(newClss[i]):=AllocMem( SizeOf(TClass) );
PClass(newClss[i]).rMaster:=AllocMem( SizeOf(TStudent) );
PClass(newClss[i]).rMaster.rBirthDay:=AllocMem( SizeOf(TBirthDay) );
SetLength( PClass(newClss[i]).rStudents, 2 );
for j:=1 to 2 do
begin
PStudent(newClss[i].rStudents[j]):=AllocMem( SizeOf(TStudent) );
PStudent(newClss[i].rStudents[j]).rBirthDay:=AllocMem( SizeOf(TBirthDay) );
end;
end;
newStu:=AllocMem( SizeOf(TStudent) );
newStu.rBirthDay:=AllocMem( SizeOf(TBirthDay) );
newCls.rLevel:=ID_CLASS;
newCls.rClassID:='98853';
newCls.rClassName:='计算机通信';
newCls.rStuCount:=2;
newCls.rMaster.rLevel:=ID_STUDENT;
newCls.rMaster.rStuID:='9885301';
newCls.rMaster.rClass:='98853';
newCls.rMaster.rNumber:='01';
newCls.rMaster.rName:='白玉川';
newCls.rMaster.rBirthDay.rYear:='1980';
newCls.rMaster.rBirthDay.rMonth:='01';
newCls.rMaster.rBirthDay.rDay:='01';
CopyStu( PStudent(newCls.rMaster), PStudent(newStu) );
for i:=1 to 2 do
begin
CopyStu( PStudent(newCls.rMaster), PStudent(newCls.rStudents[i]) );
end;
trvM.Items.Clear;
ClsNode:=trvM.Items.AddChildObjectFirst(nil, newCls.rClassName, newCls);
CurNode:=ClsNode;
StuNode:=trvM.Items.AddChildObject(CurNode, '(vip) - '+newStu.rName, newStu);
CurNode:=StuNode;
for i:=1 to 2 do
begin
StuNode:=trvM.Items.AddChildObject(ClsNode, '( '+PStudent(newCls.rStudents[i]).rNumber+') - '+
PStudent(newCls.rStudents[i]).rName,
PStudent(newCls.rStudents[i]) );
end;
CurNode:=StuNode;
for i:=1 to 2 do
begin
CopyClass( PClass(newCls), PClass(newClss[i]) );
end;
for i:=2 downto 1 do
begin
for j:=2 downto 1 do
begin
FreeMem( PStudent( PClass(newClss[i]).rStudents[j]).rBirthDay);//-这里-//
FreeMem( PStudent( PClass(newClss[i]).rStudents[j]) );
end;
FreeMem( PClass(newClss[i]).rMaster.rBirthDay);
FreeMem( PClass(newClss[i]).rMaster);
FreeMem( PClass(newClss[i]) );
end;
for i:=2 downto 1 do
begin
FreeMem( PStudent(newCls.rStudents[i]).rBirthDay );
FreeMem( PStudent(newCls.rStudents[i]) );
end;
FreeMem(newCls.rMaster.rBirthDay);
FreeMem(newCls.rMaster);
FreeMem(newCls);
FreeMem(newStu.rBirthDay);
FreeMem(newStu);
end;