스마트 포인터(Smart Pointer)의 구현
2650 단어 DELPHI
{******************************************************
*
* Delphi Smart Pointer class
* AutoPtr
* Version 0.2 beta
* Yang Qinqing @ http://www.cnblogs.com/felixyeou
*
*******************************************************}
unitAutoPtr;
interface
uses
SysUtils,
TypInfo;
type
IAutoPtr=interface
['{86DB82D6-9A32-4A6A-9191-2E0DFE083C38}']
functionGet:T;
functionRelease:T;
procedureReset(aObj:T);
end;
TAutoPtr=class(TInterfacedObject,IAutoPtr)
private
fObj:T;
fTypeInfo:PTypeInfo;
procedureFreeObj;
public
classfunctionNew(aObj:T):IAutoPtr;overload;
classfunctionNew:IAutoPtr;overload;
constructorCreate(aObj:T);virtual;
destructorDestroy;override;
functionGet:T;
functionRelease:T;
procedureReset(aObj:T);
end;
implementation
{TAutoPtr}
constructorTAutoPtr.Create(aObj:T);
begin
fObj:=aObj;
//
fTypeInfo:=TypeInfo(T);
end;
classfunctionTAutoPtr.New(aObj:T):IAutoPtr;
begin
Result:=TAutoPtr.Create(aObj)asIAutoPtr;
end;
functionTAutoPtr.Release:T;
begin
Result:=fObj;
//fObj:=nil
Integer((@fObj)^):=0;
end;
procedureTAutoPtr.Reset(aObj:T);
begin
//aObj<>fObjthen
ifInteger((@aObj)^)<>Integer((@fObj)^)then
begin
FreeObj;
fObj:=aObj;
end;
end;
destructorTAutoPtr.Destroy;
begin
//iffObj=nilthen..
ifInteger((@fObj)^)<>0then
FreeObj;
fTypeInfo:=nil;
inherited;
end;
procedureTAutoPtr.FreeObj;
begin
// TypeInfo , T Pointer
//
iffTypeInfo=nilthen
//FreeMem(Pointer((@fObj)^))
// Dispose, Dispose FreeMem:
//PUSH EAX
//CALL _Finalize
//POP EAX
//CALL _FreeMem
Dispose(Pointer((@fObj)^))
else
begin
casefTypeInfo.Kindof
tkClass:
// Object.Free, DestructorDispose(virtual)
//
TObject((@fObj)^).Free;
tkArray,tkDynArray:
//
end;
end;
//fobj:=nil;
Integer((@fObj)^):=0;
end;
functionTAutoPtr.Get:T;
begin
Result:=fObj;
end;
classfunctionTAutoPtr.New:IAutoPtr;
var
typInfo:PTypeInfo;
obj:TObject;
objNew:T;
begin
typInfo:=TypeInfo(T);
// class ,
// Delphi
//1、GetMem(p,100);
//2、New(p);
if(typInfo<>nil)and(typInfo.Kind=tkClass)then
begin
// T
obj:=GetTypeData(typInfo).ClassType.Create;
//
objNew:=T((@obj)^);
Exit(New(objNew));
end;
raiseException.Create(' class 。');
end;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스마트 포인터(Smart Pointer)의 구현{****************************************************** * * Delphi Smart Pointer class * AutoPtr * Version 0.2 beta * Ya...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.