关于指针的疑问。。。(30分)

  • 主题发起人 主题发起人 javesun
  • 开始时间 开始时间
J

javesun

Unregistered / Unconfirmed
GUEST, unregistred user!
1、说指针在指向数组的时候,是指向数组的第一个元素的地址。那在释放的时候,是释放指针变量还是释放指针指向的地址,怎么释放指向数组的指针?
2、类的对象是不是一个指针?如果是,它指向哪里?
3、如果一个函数的返回值是类,如Function Test: TObject;那么在下面的应用中,有类的对象吗?如果有应该怎么释放?
procedure TForm1.Button1Click(Sender: TObject);
begin
with Test do
..............
(or Test.Free)
end;
 
1、要看你怎么释放了,一般是释放指针指向的地址,是否指针本身,只要给它赋个空值就行了。
2、应该是个指针,指向这个实例。
3、Test返回是个类,没有创建类的对象,不需要释放。如果需要创建实例应该
with Test.create do
.....
test.free;
 
1、如果指针指向数组,那么指针本身不要释放,因为它并没有分配内存,记住一个原则,谁创建,谁释放;
2、类的对象实例可以看做是一个指针,至于指向哪里,那要看编译器了,呵呵,我们不用管它指向哪里,我有时候会把类的实例对象转换成Integer来传送;
3、这个例子里,如果test函数里创建了一个TObject的实例,那么应该在这样写:
procedure TForm1.Button1Click(Sender: TObject);
var
P : TObject;
begin
P := Test;
with P do
...
FreeAndNil(P);
end

还是记住一句话,谁创建,谁释放,如果Test函数只是给你指向了一个已经存在的TObject对象,那么就不需要释放。
 
二楼第三个问题回答有些问题,Test函数返回的是一个TObject的实例指针,如果Test这样声明的话,那是需要释放的:
function Test : TObject;
var
Obj : TObject;
begin
Obj := TObject.Create;
// 对Obj进行处理
Result := Obj;
end;
 
to Wolfding:
第一个问题还是不太明白。如果指针指向数组,那么指针本身不要释放?那么在释放指针时,指针指向的地址不释放吗?
另一个,指针指向的内存地址怎么转换成String类型给显示出来,比如放到ShowMessage()里面?
 
// 释放的问题
成对编程,也就是前面说的谁创建、谁释放,讲究要避免内存泄漏
你怎么指向都无所谓,一个Create都应该对应有Free
“那么在释放指针时,指针指向的地址不释放吗?”这话不是很贴切,可能把“地址”换成“内容”更合适,答案是,释放指针,就是为了释放内容的内存!至于这个指针执行了Free之后是否就是nil或NULL,反倒需要编程刻意去强调!如:
FreeAndNil(obj)或
obj := nil;

// 想显示其地址值吗?
var
obj: TObject;
I: Integer;
begin
obj := TObject.Create;
I := Integer(obj)
// 这个I就是地址值,如假包换
ShowMessage(IntToStr(I));
end;
 
cpj7406, thanks!
 
后退
顶部