PBuffer :=AllocMem(1024);//这里分配1024,看任务管理器,并没有1024这么大,是不是虽然分配了,但是没有利用,就不会用这么大?
PBuffer,如何给这个针数据赋值呢?比如在它的数据头赋值个Boolean型,然后紧跟其后赋值个integer? 最后可以读出这两个值。
PBuffer,如何给这个针数据赋值呢?比如在它的数据头赋值个Boolean型,然后紧跟其后赋值个integer? 最后可以读出这两个值。
调试欢乐多
这个可以用如下代码验证:var
P : Pointer;//当点了Button1后,程序占用的内存并未增加
procedure TForm1.Button1Click(Sender: TObject);
begin
GetMem(P , 50 * 1024 * 1024);
end;
//当使用这片内存时,内存就真实的从Winows分配物理内存并映射了
//点了Button2后,程序使用内存增加了大概50M
procedure TForm1.Button2Click(Sender: TObject);
begin
FillChar(P^ , 50*1024*1024 , 0);
end;
//释放
procedure TForm1.Button3Click(Sender: TObject);
begin
FreeMem(P);
end;
第二,Delphi的程序由自己的内存管理体系详见GETMEM.INC代码,你申请1024字节,但是内存管理发现现在已经有200空闲字节,那么就只需要延伸多余部分即可,所以增加的并不一定就是1024.第2个问题,指针赋值的问题一般这么写var
P : PAnsiChar;
begin
GetMem(P , ...
FillChar(P^ , ....
PBoolean(P)^ := True; //第1个字节
PInteger(P+1)^ := 100; //第2,3,4,5字节
//类推,最好的是定义一个对应的结构来处理
end;
Type
PRecFire = ^TRecFire;
TRecFire = packed record
B : Boolean; //第一个字节
i : integer; //第2,3,4,5字节
//.....
end;var
P : PRecFire;
begin
GetMem(P , ...
FillChar(P^ , ....
P.B := True; //第1个字节
P.i := 100; //第2,3,4,5字节
...
end;
我现在要做的事,分配的内存指针数据。取第一位,判断其Boolen值,如果是假,就放弃。如果是真
那么标记为假,然后将指针后移一位,返回其后移一位的地址。
function TForm1.Move2(S: Pointer):Pointer;
var
F:Boolean;
B:Pointer;
begin
CopyMemory(@F,s,1);
if not F then
b:=nil
else
begin
////怎么写?
end;
end;
function TForm1.Move2(S: Pointer):Pointer;
var
F:Boolean;
B:Pointer;
a:Integer;
a2:Integer;
begin
CopyMemory(@F,s,1);
if not F then
begin
b:=nil;
Result :=b;
end
else
begin
a:=Integer(Cardinal(S));
a2:=a-1;
b:=@Cardinal(a2);
end;
end;不知道有没有问题