这样做会发生内存漏失吗? TTest = record
a : string;
end;
PTest = ^TTest;
var
P : PTest;
P2 : pointer;
begin
P := new(PTest);
p.a := 'abc';
p.a := p.a + '333';
P2 := p;
Dispose(P2);
a : string;
end;
PTest = ^TTest;
var
P : PTest;
P2 : pointer;
begin
P := new(PTest);
p.a := 'abc';
p.a := p.a + '333';
P2 := p;
Dispose(P2);
解决方案 »
- delphi用idhttp提交信息后截取的数据包末尾怎么都多了个&符号?
- 向服务器程序高手请教SocketServer的多线程问题。
- 哪位有regware2的控件,帮忙发给我,万分感激
- 如何去掉string中的回车换行符?
- 谁用delphi7连接sybase数据库的实例
- 如何提高internet上数据的传输速度
- 怎么才能让我做的软件做成一个限时版的东西,好象有什么软件可以做,能介绍一个好的吗,谢谢
- 改用 ADO, 遇到 TBatchMove 的问题
- 请问如何用delphi在excel文件中合并单元格?
- 请大家帮帮忙
- ____________名其妙的"insert into 语法错误"~~谢谢各位前辈帮看看
- 如何获取固定路径下的所有文件名?
P := new(PTest);
Dispose(P2);
都释放掉了
p.a 因为创建在栈里 引用记数为0 也会释放的
P := new(PTest);//?应改为new(p);
在delphi中,New是这样申明的procedure New(var P: Pointer);
p2,p都指向了new(p)分配的内存区域,Dispose(p2)释放p2指向的内存区域。
因此不会产生内存泄漏。
按樓主的代碼,我寫在一個Button的雙擊事件中,編譯成EXE文件後,
再執行,一直點擊那個Button,然後我打開《工作管理員》發現:程序占用的內存一直在上升所以我判斷出,不能釋放
我估計是string類型出的問題
p.a := 'abc';
p.a := p.a + '333';
P2 := p;
Dispose(P2); ---->释放
指针就是堆上的内存,所以要手动释放,在dispose之后,所有与那个内存地址相关的联系都被切断,所以不会产生内存泄露...
他和freemem功能相似,不过他会首先将long strings、variants、dynamic arrays置为空、interfaces为Unassigned;
执行了下面的代码,会发现很多有趣的事情,//后面的是我的执行结果,不同机器结果应该不同的...
procedure TForm1.Button1Click(Sender: TObject);
var
P : PTest;
P2 : pointer;
begin
P := new(PTest);
p.a := 'abc';
p.a := p.a + '333';
P2 := p;
showmessage(IntToStr(Integer(P2^))); //13450604
showmessage(IntToStr(Integer(P2))); //13450584
showmessage(IntToStr(Integer(P^))); //13450604
showmessage(IntToStr(Integer(P))); //13450584
showmessage(IntToStr(Integer(@P))); //1242440
showmessage(IntToStr(Integer(@P2))); //1242436
Dispose(P2);
P.a:='新的内容';
showmessage(p.a);
showmessage(PTest(P2).a);
showmessage(IntToStr(Integer(P2^))); //13450580
showmessage(IntToStr(Integer(P2))); //13450584
showmessage(IntToStr(Integer(P^))); //13450580
showmessage(IntToStr(Integer(P))); //13450584
showmessage(IntToStr(Integer(@P))); //1242440
showmessage(IntToStr(Integer(@P2))); //1242436end;
showmessage(PTest(P2).a);
不同啊,不同,谁能解释一下这个现象...
想要把这个问题搞明白,不然今天就不吃饭了
...
Dispose(P2);p会被释放
a : string;
end;
PTest = ^TTest;
var
P : PTest;
P2 : pointer;
begin
P := new(P); // 这里错误,改正一下, 谢谢 sxqwhxq(步青云)
p.a := 'abc';
p.a := p.a + '333';
P2 := p;
Dispose(P2);
最后根据汇编代码分析,这样做会发生内存漏失,谢谢各位的回答
==理由是:
Dispose(P2); // 只能释放 TTest 这个 Record的内存,而不能释放 a 这个字符串所申请的内存因为 Dispose(P2) 只会调用 FreeMem
而 Dispose(P) 会在 FreeMem 前,调用释放 Record内字段的一段程序
Finalize(P); // 在这里释放 a 这个字符串的内存
FreeMem(P);
showmessage(PTest(P2).a);
不同啊,不同,谁能解释一下这个现象...
想要把这个问题搞明白,不然今天就不吃饭了
======================================================
有不同吗?