如何知道对象变量所指的对象是否存在?
如何知道一个指针对应的内存否被占用?
例如:
p := TObject.Create;
p2 := p;
if NeedFree then
FreeAndNil(p);
if IsTheAddressUsed(p2) then
ShowMessage('p2所指的对象实例还没有被释放')
else
ShowMessage('p2所指的对象实例还没有被释放');
请问函数IsTheAddressUsed(p2)要如何实现?谢谢!或者
var
pi, ph : Pinteger;
begin
New(pi);
ph := pi;
Dispose(pi);
if IsTheAddressUsed(ph) then
ShowMessage('ph所指的对象实例还没有被释放')
else
ShowMessage('ph所指的对象实例还没有被释放');
end;
如何知道一个指针对应的内存否被占用?
例如:
p := TObject.Create;
p2 := p;
if NeedFree then
FreeAndNil(p);
if IsTheAddressUsed(p2) then
ShowMessage('p2所指的对象实例还没有被释放')
else
ShowMessage('p2所指的对象实例还没有被释放');
请问函数IsTheAddressUsed(p2)要如何实现?谢谢!或者
var
pi, ph : Pinteger;
begin
New(pi);
ph := pi;
Dispose(pi);
if IsTheAddressUsed(ph) then
ShowMessage('ph所指的对象实例还没有被释放')
else
ShowMessage('ph所指的对象实例还没有被释放');
end;
不过动态分配内存就不用管用不用了
直接GetMem跟FreeMem不行吗?
var
a, b: TPerson;
begin
a := TPerson.Create;
b := a; // b和a指向了同一块内存
FreeAndNil(a); // 内存已被释放,这时候如果再操作b将导致非法操作
end;
something;
except on E:内存地址非法访问 do
“malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!”
windows让不让我访问这样的空闲结点链表,如果不让的话,有没有提供这样的API: IsTheAddressUsed(lpPtr ph,[int Size]);第一个参数是一个指针。
盼望高手给一个明确的答案,否则我就吃不香睡不好,当然我也努力去找答案,如果找到了答案也会告诉大家。
VM是可以知道内存是否被使用的
1. Delphi的内存管理器释放此对象内存时, 发现此内存块所在的整个大块都已经没有内存被使用, 则向操作系统释放了整个大内存块。
2. Delphi的内存管理器释放此对象内存时, 发现此内存块所在的整个大块还有内存正被使用,其只是在自己的内存管理器中标识此内存已经被释放。对于以上两种情况,其分别对应:
1. Delphi内存管理器认为此内存无效,操作系统的内存管理器也认为此内存无效。
2. Delphi内存管理器认为此内存无效,操作系统的内存管理器却认为此内存有效。对于操作系统而言,有以下API能够用于判断内存是否有效:IsBadCodePtr、IsBadReadPtr、IsBadWritePtr对于Delphi内存管理器来说,其内存管理器是可以指定的,但Delphi提供缺省的内存管理器。
Delphi提供的缺省的内存管理器,并未提供完成楼主所需功能的函数。要完成楼主的功能,有两种方法:
1. 楼主可以根据Delphi提供的缺省内存管理器的源码,自己写所需的函数。但不同版本的Delphi提供的缺省的内存管理器有一定区别。如老版本的Delphi提供的缺省的内存管理器性能就比较差,相比之下内存占用比较多,性能比较差,自Delphi 2006之后,其参考FastMM,有相当大的改善。(如:Delphi 2007的缺省内存管理器的源码位于源文件 getmem.inc )
2. 或楼主可以使用自己所写的内存管理器。 如:MemoryManager.GetMem, MemoryManager.AllocMem 直接调用LocalAlloc, MemoryManager.ReallocMem直接调用 LocalReAlloc, MemoryManager.FreeMem直接调用LocalFree。则直接使用IsBadWritePtr就可以完成楼主所要求的功能。当然,这个简单的内存管理器性能很差。
再请问:一个进程结束后,delphi程序员没有将一小块内存(例如New(pi : PInteger 分配的内存,姑且称为IM)释放,IM所在的大内存(且称为BIM)。结果会不会造成内存泄漏,如果会,是只有IM泄漏还是连BIM都泄漏了?
重新请问:
一个进程结束后,delphi程序员没有将一小块内存(例如New(pi:PInteger)分配的内存)释放,(将这个小内存姑且称为IM,IM所在的大内存称为BIM)。结果会不会造成内存泄漏,如果会,是只有IM泄漏还是连BIM都泄漏了?
如何知道一个指针对应的内存否被占用?VAR P:POINTER;
A:TLEBEAL;
BEGIN
IF A = NILL THEN
A := A.TLEABEL.CREATE; IF ASSIGNED(P)THEN
P:= .......
END;