关于 Delphi 中内存释放

关于 Delphi 中内存释放,第1张

过程内定义的字符串类型变量,即局部变量,当过程执行完毕,局部变量即自动销毁,无需程序员处理.

至于你所说的结构体,大概说的是自定义记录类型吧,你在创建实例和使用之后,用free销毁它就行了.全局变量,它的作用是在整个程序运行期间起保存和传递数据之用的,也就是说这个变量在用户执行某一操作之后,要保存数据,过一会用户在执行另一个操作时,还要使用这个数据,只有要承担这种任务的变量才定义为全局变量,除此之外,都应定义为局部变量.全部变量中的数据需要程序员销毁或者清除才能释放内存资源.

这个函数不需要释放。

你可以用以下方法验证:

unit Unit2

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls

type

PTT= ^TStringList

TForm2 = class(TForm)

Button1: TButton

procedure Button1Click(Sender: TObject)

private

function StrListFunError(Var AI: PTT):TStringList

function StrListFunRight(Var AI: PTT):TStringList

public

end

var

Form2: TForm2

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject)

var

test:TStringList

tt1:PTT

begin

test:=TStringList.Create

try

test:=StrListFunError(tt1)//虽然此时未报错,得所指向的对象已经不正确

ShowMessage(tt1^.Text )//因为已经被释放,不能显示正确值

ShowMessage(test[0])//出错,因为在原函数中已经被释放

test:=StrListFunRight(tt1)

ShowMessage(tt1^.Text)//test还没有使用,所以没有被释放,可以显示正确值

ShowMessage(test[0])

ShowMessage(tt1^.Text)//test已经使用,所以被释放,出现错误

//结论:

//对于TStringList作为函数或者过程的返回值时,在被调函数内不需要释放

//由编译器进行自动处理

finally

test.Free

end

end

function TForm2.StrListFunError(Var AI:PTT): TStringList

var

Re:TStringList

begin //错误代码

Re:=TStringList.Create

Ai:=@Re

try

Re.Add('Error Test')

Result:=Re

finally

Re.Free

end

end

function TForm2.StrListFunRight(var AI: PTT): TStringList

var

Re:TStringList

begin //正确代码

Re:=TStringList.Create

Ai:=@Re

try

Re.Add('Right Test')

Result:=Re

finally

//正确代码,不需要释放,交由编译器处理

//Re.Free

end

end

end.

Delphi有静态加载Dll和动态加载Dll,静态加载的Dll不用我们释放;动态加载需要我们自己释放;

这里只附上动态加载DLL的释放(此处Dll和Exe程序在同一路径下):

procedure TForm1.Button2Click(Sender: TObject)

var MyHandle:THandle

FPointer:Pointer

MyDll_Func: function (s:string):Integerstdcall

begin

try

try

MyHandle:=LoadLibrary('project1.Dll')

if MyHandle<>0 then

begin

FPointer:=GetProcAddress(MyHandle ,PChar(Edit1.text))

if FPointer<>nil then

begin

MyDll_Func:=FPointer

MyDll_Func(Edit1.text)

end

else

ShowMessage('此'+Edit1.text+'方法,在project1.Dll中不存在')

end

except

showmessage('加载project1.Dll异常')

end

finally

FreeLibrary(MyHandle)

end

end


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/370553.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存