在程序某处创建了一个TStringList对象:
rfLstURL:=TStringList.Create;现在想实现这样的目的,当rfLstURL已经释放,则不处理,否则,释放:
if rfLstURL<>nil then rfLstURL.Free;
但上面的代码在rfLstURL已经释放仍会报内存错误?
rfLstURL:=TStringList.Create;现在想实现这样的目的,当rfLstURL已经释放,则不处理,否则,释放:
if rfLstURL<>nil then rfLstURL.Free;
但上面的代码在rfLstURL已经释放仍会报内存错误?
if Assigned(rfLstURL) Then FreeAndNil(rfLstURL);
这里判断没有什么用的!对象的Free方法本来就会判断对象是不是nil的!你在所有释放rfLstURL时不要调用rfLstURL.Free;而要这样
FreeAndNil(rfLstURL) <==> rfLstURL.Free;rfLstURL := nil;
这样就不会出错了
FreeAndNil(rfLstURL);
begin
if Self <> nil then
Destroy;
end;
如果我已经在别的地方Free了,就会报内存错误。
楼主你没弄清楚,rfLstURL你可以理解为是个指针,指向一个Tstringlist对象
对象有没有free有没有create,与rfLstURL这个指针是否为nil没有任何关系.你声明了rfLstURL,rfLstURL就不是nil,除非你手动把它赋值为nil.如果你想用rfLstURL是否为nil来判断rfLstURL的对象是否存在的话,你必须做到:
1.rfLstURL声明后,create之前,要rfLstURL:=nil;
2.free之后也要rfLstURL:=nil;而freeandnil(rfLstURL)这个函数就相当于:
rfLstURL.free;
rfLstURL:=nil;
但是如果我之前用的是Free,则用上面两种办法都会报错;
即:FreeAndNil(rfLstURL);
if rfLstURL<>Nil then FreeAndNil(rfLstURL);
if assigned(rfLstURL) then FreeAndNil(rfLstURL);
都可以。但:
frLstURL.Free;
if rfLstURL<>Nil then FreeAndNil(rfLstURL);
if assigned(rfLstURL) then FreeAndNil(rfLstURL);
都会报内存错误。
我认为不好判断!