本人是从c++转向delphi的(被迫的),因此,很多问题还是习惯借鉴c++角度考虑.从ModelMaker生成单件模式代码的时候,有个函数是这样的:class function TAppInfo.AccessInstance(Request: Integer): TAppInfo;
{ $J+ }
const FInstance: TAppInfo = nil;
{ $J- }
begin
case Request of
0 : ;
1 : if not Assigned(FInstance) then FInstance := CreateInstance;
2 : FInstance := nil;
else
raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
end;
Result := FInstance;
end;问题一: FInstannce常量的生存期怎么看待?
问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)
使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),
是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
问题四: 局部变量是否一定要初始化,否则内容未知.用delphi超不爽,找个资料,真tmd难.垃圾书漫天飞.
{ $J+ }
const FInstance: TAppInfo = nil;
{ $J- }
begin
case Request of
0 : ;
1 : if not Assigned(FInstance) then FInstance := CreateInstance;
2 : FInstance := nil;
else
raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
end;
Result := FInstance;
end;问题一: FInstannce常量的生存期怎么看待?
问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)
使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),
是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
问题四: 局部变量是否一定要初始化,否则内容未知.用delphi超不爽,找个资料,真tmd难.垃圾书漫天飞.
解决方案 »
- 长假了,散分~~
- 有关TDBGridEh的一个单元格内容复制的问题?还有TDBGridEh的内容过滤问题?
- 简单的SQL语句,大家来帮帮忙
- Dephi很不稳定,大家都是怎么做的, 比如在Action Update上写个事件,可就是不跑
- 我采用fastreport做人事程序报表,请大家帮忙,并在线加分.
- ******** 150分开二帖求助!请高手帮助!up 有分 ********
- 急啊~关于一个QRREPORT上面有2个QUERY。
- 单位里有套很老的系统,用的数据库是这三种后缀名.ix .dat .dia,有谁知道是什么数据库怎么读取么?
- 请有WinNT系统的朋友帮忙,我想知道一个窗体的长和宽?
- 在Delphi中怎样防止应用程序的第二个实例运行?
- FastReport横向打印的奇怪问题,请大家看看
- 关于阶梯水价格再问
1 是对象的生存周期
2 free是释放对象 nil则是清除对象占用内存 在delphi里面,创建对象后,可以让它 = nil,之后还可以进行复制等操作,但是free后就不能再使用该对象了
4 不一定,delphi一般会有默认值
2 free是释放对象 nil则是清除对象占用内存 在delphi里面,创建对象后,可以让它 = nil,之后还可以进行复制等操作,但是free后就不能再使用该对象了
问题是赋值nil后,还需要用户清楚对象占用的内存吗?
同C++一样问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
FInstantce应该是COM对象,而COM对象是不能用Free的,直接nil就可以。非COM对象的free和nil同C++问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
不用指定类型。C++需要指定类型吗?问题四: 局部变量是否一定要初始化,否则内容未知.
同C++
>>同C++一样要是和c++一样,在局部就释放了。c++有静态成员,delphi有吗?而这里作为单件模式,显然是具有全局性的,但怎么解释?问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
FInstantce应该是COM对象,而COM对象是不能用Free的,直接nil就可以。非COM对象的free和nil同C++这是个单件模式,全局对象不一定是com对象。问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
不用指定类型。C++需要指定类型吗?c++不指定类型,释放安全吗?难道都由编译器完成?
3. 一般情况下delphi的释放是会指定类型的, 比如我在一个容器里面放了N个 Tasd类型的对象,释放的时候是 Tasd(list.items[i]).free
在C++里,对象变量不是指针。声明了对象变量之后,实际上也就在栈区创建了对象本身。当对象变量的生存期结束之后,对象也就自动释放了,除非是动态创建的对象。
Delphi的对象变量和Java一样,实际上只是指向对象的指针。当声明对象变量时,对象实际上并没有自动创建。还要另外用语句进行创建。因此Delphi中所有对象都是从堆内存创建的,到最后要手动进行释放,不然它会一直存在下去。
>>>>问题一: FInstannce常量的生存期怎么看待?FInstance的生存期只在函数中,函数结束后,它就不存在了。当然了,是这个“指针”不存在了,它所指向的对象实体(如果已经创建了的话)在被手动释放前还是一直存在的。FInstance的确也没有存在的必要了,它的值已经被当作函数的返回值被传递出去了。>>>>问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?只有Free才能释放对象。将对象变量赋为nil值不是释放手段,这只会让它不指向任何地方,如此而已。对象不受影响。>>>问题三:不需要指定类型。>>>问题四: 局部变量是否一定要初始化,否则内容未知.要初始化。Delphi好的资料少,这的确是个问题。另外楼主说的静态成员,Delphi2006开始已经有了。
只有Free才能释放对象。将对象变量赋为nil值不是释放手段,这只会让它不指向任何地方,如此而已。对象不受影响。问题是,这是modelmaker生成的代码,是直接赋值nil的. 还有我确实看到过有的代码比如TXMLDocument创建的时候用constructor create,释放的时候直接赋值nil>>>问题三:不需要指定类型。这个负担都由编译器承担,有点不可思议.
另外,有没有什么权威的地方可以直接参考的.谢谢
//这个问题有没有看到编绎指令{$j+},在这个编绎指定下声明的变量,就相当于在这个函数里面声明了一个可变的常量,比如你每一次用这个方法给值,FInstannce := obj1;而里下一次又访问这个函数时,这个FInstannce就是上一次obj1的值了,生命周期是个全局的,直到程序结束..问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
//看看Free的源码就知道了
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;问题三: New(TMyPointer),则释放的时候是Dispose(TMyPointer)
使用Dispose释放指针指向的内容时,必须指定指针类型吗? 比如Dispose(mylist.Items[i]),
是否合法?(mylist : TList).我看到dev-cpp里面就没指定指针类型.
//不需要指定类型
问题四: 局部变量是否一定要初始化,否则内容未知.
//不一定,但建意初始化
>>同C++一样要是和c++一样,在局部就释放了。c++有静态成员,delphi有吗?而这里作为单件模式,显然是具有全局性的,但怎么解释?***注意看{ $J+ }。这就是Delphi的“静态变量”问题二: 一般对象释放都用object.Free,FInstantce := nil,这也是释放的手段? 和.Free释放对象有什么不一样?
FInstantce应该是COM对象,而COM对象是不能用Free的,直接nil就可以。非COM对象的free和nil同C++这是个单件模式,全局对象不一定是com对象。***什么叫“不一定是com对象”?如果是,那么直接nil,如果不是,直接nil就不行。