定义一个内存指针;在Getmem为其分配内存之前使用或者释放都可能造成比较严重的问题;
所在我想在使用或者释放以前都加个判断;譬如
if P <> nil and (not ssigned(P) ) then
begin
freemem(P);
FreeAndNil(P);
end;但,上面两个判断条件都没有挡住;在我没有执行GetMem的情况下;
依然可以执行到FreeMem;
然后就报错了。
所在我想在使用或者释放以前都加个判断;譬如
if P <> nil and (not ssigned(P) ) then
begin
freemem(P);
FreeAndNil(P);
end;但,上面两个判断条件都没有挡住;在我没有执行GetMem的情况下;
依然可以执行到FreeMem;
然后就报错了。
if not Assigned(P) then
FreeMen(P);
就行了。。
P先初始为nil 即p:=nilFreeAndNil 只用于类对象
if not assigned(P) then判断仍然执行了。
那么用assigned就可以检测到。
var
p:PChar;
begin
p:=nil; //do somthing, getmem or not if Assigned(p) then FreeMem(p);
Assigned(P)对于指针变量相当于 P<>nil
对于过程变量相当于@P <> nil 用函数测试如下
var
P:pointer;
begin
p:= nil;
if not Assigned(P) then
Edit1.Text := 'P is Nil.';
GetMem(p,1024);{p有效}
FreeMem(p,1024); {p不再有效且非空}
if Assigned(P) then
Edit2.Text := 'P is Not Nil.';
end;执行结果如下:
P is nil;
P is not Nil.
就是说,FreeMem过程执行后Assigned(P)依然可以检测到;我想知道的是,怎么能检测到当前指针p是否有效?
end;
定义完先初始化是个好注意;可行;谢谢了。还有新招没?