Delphi关于内存释放的一个问题..... delphi内存 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 var TempP, OutP, tempp1, outp1: PChar; TempS, Outstr: string; I: Integer;begin TempP := StrAlloc(1024); //申请1KB内存,并将TempP指向这块内存 ShowMessage(Format('TempP的地址为:%p',[Pointer(TempP)])); TempS := TempS + '12344545454'; //为TempS赋新值,导致一次CopyOnWrite ShowMessage(Format('TempS的地址为:%p',[Pointer(TempS)])); TempP := PChar(TempS); //将TempP指向TempS的地址(TempP指向的原1KB内存无法释放了,因为没有指针可以指向它了) ShowMessage(Format('TempS的地址为:%p%sTempP新地址为:%P',[Pointer(TempS),#13#10,Pointer(TempP)])); Outstr := StrPas(TempP); StrDispose(TempP); //TempP指向的地址根本不是你手动申请的,它是CopyOnWrite后的string,无法用StrDispose释放 Edit1.Text := Outstr;end; var TempP, OutP: PChar; TempS, Outstr: string;begin TempP := StrAlloc(1024); // 申请1KB内存,并将TempP指向这块内存 OutP := TempP; // 虽然下面的代码将TempP指向新地址(导致内存泄露),好在这里用OutP指向了这1KB内存,后面还是可以释放这块内存的 ShowMessage(Format('TempP保存的地址为:%p', [Pointer(TempP)])); TempS := TempS + '12344545454'; // 为TempS赋新值,导致一次CopyOnWrite ShowMessage(Format('TempS保存的地址为:%p', [Pointer(TempS)])); TempP := PChar(TempS); // 将TempP指向TempS的地址 ShowMessage(Format('TempS保存的地址为:%p%sTempP保存的新地址为:%P', [Pointer(TempS), #13#10,Pointer(TempP)])); Outstr := StrPas(TempP); StrDispose(OutP); //幸好之前用OutP指向了这块内存,不然这1KB内存就泄露了 Edit1.Text := Outstr;end; procedure TForm1.Button2Click(Sender: TObject);var TempP,OutP,tempp1,outp1:PChar; TempS,Outstr:string; I:Integer;begin TempP:=StrAlloc(1024); TempS:=TempS+'12344545454'; StrPCopy(TempP, TempS); Outstr:=StrPas(TempP); StrDispose(TempP); Edit1.Text:=Outstr;end;这样修改,就可以了。 关于循环检测的Timer,应该怎么设计?------------[有点难] 如何在编写dll文件中动态的使用组件 如何知道当前所在的目录?全部家当只求一解! 关于select查询语句的问题 求助如何将距阵求逆 再来接分吧 TDBEdit的怪现象 這條信息是什麼意思.... 救急!!各位,哪里还有Delphi5下载??我要用来打开以前5的东西。用Delphi6打开会报错。 关于DELPHI和网络的问题 请求解决:已动态创建了GroupBox,Memo,CheckBox如何将CheckBox名添加对应的Memo 请教:DELPHI7动态连接SQL SERVER2008
var
TempP, OutP, tempp1, outp1: PChar;
TempS, Outstr: string;
I: Integer;
begin
TempP := StrAlloc(1024); //申请1KB内存,并将TempP指向这块内存
ShowMessage(Format('TempP的地址为:%p',[Pointer(TempP)]));
TempS := TempS + '12344545454'; //为TempS赋新值,导致一次CopyOnWrite
ShowMessage(Format('TempS的地址为:%p',[Pointer(TempS)]));
TempP := PChar(TempS); //将TempP指向TempS的地址(TempP指向的原1KB内存无法释放了,因为没有指针可以指向它了)
ShowMessage(Format('TempS的地址为:%p%sTempP新地址为:%P',[Pointer(TempS),#13#10,Pointer(TempP)]));
Outstr := StrPas(TempP);
StrDispose(TempP); //TempP指向的地址根本不是你手动申请的,它是CopyOnWrite后的string,无法用StrDispose释放
Edit1.Text := Outstr;
end;
var
TempP, OutP: PChar;
TempS, Outstr: string;
begin
TempP := StrAlloc(1024); // 申请1KB内存,并将TempP指向这块内存
OutP := TempP; // 虽然下面的代码将TempP指向新地址(导致内存泄露),好在这里用OutP指向了这1KB内存,后面还是可以释放这块内存的
ShowMessage(Format('TempP保存的地址为:%p', [Pointer(TempP)]));
TempS := TempS + '12344545454'; // 为TempS赋新值,导致一次CopyOnWrite
ShowMessage(Format('TempS保存的地址为:%p', [Pointer(TempS)]));
TempP := PChar(TempS); // 将TempP指向TempS的地址
ShowMessage(Format('TempS保存的地址为:%p%sTempP保存的新地址为:%P', [Pointer(TempS), #13#10,Pointer(TempP)]));
Outstr := StrPas(TempP);
StrDispose(OutP); //幸好之前用OutP指向了这块内存,不然这1KB内存就泄露了
Edit1.Text := Outstr;
end;
var
TempP,OutP,tempp1,outp1:PChar;
TempS,Outstr:string;
I:Integer;
begin
TempP:=StrAlloc(1024);
TempS:=TempS+'12344545454';
StrPCopy(TempP, TempS);
Outstr:=StrPas(TempP);
StrDispose(TempP);
Edit1.Text:=Outstr;
end;
这样修改,就可以了。