小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Delphi中釋放介紹

 quasiceo 2013-01-21

Delphi中釋放介紹

509人閱讀 評論(0) 收藏 舉報(bào)

在delphi中,有些函數(shù)或者設(shè)置會(huì)使對象自動(dòng)釋放,此時(shí)如果在次釋放會(huì)發(fā)生野指針的現(xiàn)象,導(dǎo)致莫名的錯(cuò)誤。

下面介紹幾種經(jīng)常見到的釋放規(guī)則。

(一)、使用 TObjectList

  1. procedure TForm1.Button1Click(Sender: TObject);  
  2. var  
  3.   list: TObjectList;  
  4.   i: Integer;  
  5.   btn: TButton;  
  6. begin  
  7.   list := TObjectList.Create;  
  8.   for i := 0 to 6 do  
  9.   begin  
  10.     btn := TButton.Create(Self);  
  11.     with btn do begin  
  12.       Caption := Format('Btn %d', [i+1]);  
  13.       Parent := Self;  
  14.     end;  
  15.     list.Add(btn);  
  16.   end;  
  17.   ShowMessage('TObjectList 釋放時(shí), 會(huì)同時(shí)釋放其中的對象');  
  18.   list.Free;  
  19. end;  
  20.   
  21. procedure TForm1.Button2Click(Sender: TObject);  
  22. var  
  23.   list: TList;  
  24.   i: Integer;  
  25.   btn: TButton;  
  26. begin  
  27.   list := TList.Create;  
  28.   for i := 0 to 6 do  
  29.   begin  
  30.     btn := TButton.Create(Self);  
  31.     with btn do begin  
  32.       Caption := Format('Btn %d', [i+1]);  
  33.       Parent := Self;  
  34.     end;  
  35.     list.Add(btn);  
  36.   end;  
  37.   ShowMessage('TList 釋放后, 其中的對象并未釋放');  
  38.   list.Free;  
  39. end;  

(二)使用 TObjectList<T>

  1. procedure TForm1.Button1Click(Sender: TObject);  
  2. var  
  3.   list: TObjectList<TButton>;  
  4.   i: Integer;  
  5.   btn: TButton;  
  6. begin  
  7.   list := TObjectList<TButton>.Create;  
  8.   for i := 0 to 6 do  
  9.   begin  
  10.     btn := TButton.Create(Self);  
  11.     with btn do begin  
  12.       Caption := Format('Btn %d', [i+1]);  
  13.       Parent := Self;  
  14.     end;  
  15.     list.Add(btn);  
  16.   end;  
  17.   ShowMessage('TObjectList 釋放時(shí), 會(huì)同時(shí)釋放其中的對象');  
  18.   list.Free;  
  19. end;  
  20.   
  21. procedure TForm1.Button2Click(Sender: TObject);  
  22. var  
  23.   list: TList<TButton>;  
  24.   i: Integer;  
  25.   btn: TButton;  
  26. begin  
  27.   list := TList<TButton>.Create;  
  28.   for i := 0 to 6 do  
  29.   begin  
  30.     btn := TButton.Create(Self);  
  31.     with btn do begin  
  32.       Caption := Format('Btn %d', [i+1]);  
  33.       Parent := Self;  
  34.     end;  
  35.     list.Add(btn);  
  36.   end;  
  37.   ShowMessage('TList 釋放后, 其中的對象并未釋放');  
  38.   list.Free;  
  39. end;  


(三)使用記錄而不是記錄指針

  1. {假如某個(gè)函數(shù)的參數(shù)需要一個(gè)結(jié)構(gòu)指針}  
  2. function Area(rect: PRect): Integer;  
  3. begin  
  4.   Result := rect.Width * rect.Height;  
  5. end;  
  6.   
  7. {直接聲明指針并分配空間后需手動(dòng)釋放}  
  8. procedure TForm1.Button1Click(Sender: TObject);  
  9. var  
  10.   P: PRect;  
  11. begin  
  12.   New(P);  
  13.   P^ := Rect(10106050);  
  14.   ShowMessage(IntToStr(Area(P))); //2000  
  15.   Dispose(P);  
  16. end;  
  17.   
  18. procedure TForm1.Button2Click(Sender: TObject);  
  19. var  
  20.   R: TRect;  
  21. begin  
  22.   R := Rect(10106050);  
  23.   ShowMessage(IntToStr(Area(@R))); //2000  
  24. end;  

(四)使用動(dòng)態(tài)數(shù)組

  1. procedure TForm1.Button1Click(Sender: TObject);  
  2. var  
  3.   arr: Array of string;  
  4.   i: Integer;  
  5.   s: string;  
  6. begin  
  7.   for i := 0 to 3 do  
  8.   begin  
  9.     SetLength(arr, Length(arr)+1);  
  10.     arr[High(arr)] := StringOfChar(Char(i + 1), 3);  
  11.   end;  
  12.   for s in arr do ShowMessage(s);  
  13. end;  
  14.   
  15. procedure TForm1.Button2Click(Sender: TObject);  
  16. var  
  17.   arr: TArray<string>;  
  18.   i: Integer;  
  19.   s: string;  
  20. begin  
  21.   for i := 0 to 23 do  
  22.   begin  
  23.     SetLength(arr, Length(arr)+1);  
  24.     arr[High(arr)] := StringOfChar(Char(i + 1), 3);  
  25.   end;  
  26.   for s in arr do ShowMessage(s);  
  27. end;  

(五)在 initialization 中建立、在 finalization 中釋放

  1. type  
  2.   TForm1 = class(TForm)  
  3.     Button1: TButton;  
  4.     procedure Button1Click(Sender: TObject);  
  5.   end;  
  6.   
  7. var  
  8.   Form1: TForm1;  
  9.   
  10. implementation  
  11.   
  12. {$R *.dfm}  
  13.   
  14. var  
  15.   List: TStringList;  
  16.   
  17. procedure TForm1.Button1Click(Sender: TObject);  
  18. begin  
  19.   List.Clear;  
  20.   List.Add('WanYi');  
  21.   ShowMessage(List.Text);  
  22. end;  
  23.   
  24. initialization  
  25.   List := TStringList.Create;  
  26. finalization  
  27.   List.Free;  
  28.   
  29. end.  

(六)使用記錄(現(xiàn)在的記錄支持使用方法)

  1. type  
  2.   TForm1 = class(TForm)  
  3.     Button1: TButton;  
  4.     procedure Button1Click(Sender: TObject);  
  5.   end;  
  6.   
  7.   //  
  8.   TBase = record  
  9.   private  
  10.     FName: string;  
  11.     procedure SetName(const AName: string);  
  12.   public  
  13.     constructor Create(const AName: string);  
  14.     property Name: string read FName write SetName;  
  15.   end;  
  16.   
  17. var  
  18.   Form1: TForm1;  
  19.   
  20. implementation  
  21.   
  22. {$R *.dfm}  
  23.   
  24. procedure TForm1.Button1Click(Sender: TObject);  
  25. var  
  26.   X: TBase;  
  27. begin  
  28.   X := TBase.Create('Test');  
  29.   ShowMessage(X.Name);  
  30.   X.Name := 'Test1';  
  31.   ShowMessage(X.Name);  
  32.   {X 在此自動(dòng)釋放}  
  33. end;  
  34.   
  35. { TBase }  
  36.   
  37. constructor TBase.Create(const AName: string);  
  38. begin  
  39.   FName := AName;  
  40. end;  
  41.   
  42. procedure TBase.SetName(const AName: string);  
  43. begin  
  44.   FName := AName;  
  45. end;  
  46.   
  47. end.  

(七)使用接口

  1. type  
  2.   TForm1 = class(TForm)  
  3.     Button1: TButton;  
  4.     procedure Button1Click(Sender: TObject);  
  5.   end;  
  6.   
  7.   //  
  8.   IBase = Interface  
  9.     function GetName: string;  
  10.     procedure SetName(const AName: string);  
  11.     property Name: string read GetName write SetName;  
  12.   end;  
  13.   
  14.   //  
  15.   TBase = class(TInterfacedObject, IBase)  
  16.   private  
  17.     FName: string;  
  18.   protected  
  19.     function GetName: string;  
  20.     procedure SetName(const AName: string);  
  21.   public  
  22.     constructor Create(const AName: string);  
  23.   end;  
  24.   
  25. var  
  26.   Form1: TForm1;  
  27.   
  28. implementation  
  29.   
  30. {$R *.dfm}  
  31.   
  32. procedure TForm1.Button1Click(Sender: TObject);  
  33. var  
  34.   X: IBase;  
  35. begin  
  36.   X := TBase.Create('Test');  
  37.   ShowMessage(X.Name);  
  38.   X.Name := 'Test1;  
  39.   ShowMessage(X.Name);  
  40.   {X 在此自動(dòng)釋放}  
  41. end;  
  42.   
  43. { TBase }  
  44.   
  45. constructor TBase.Create(const AName: string);  
  46. begin  
  47.   FName := AName;  
  48. end;  
  49.   
  50. function TBase.GetName: string;  
  51. begin  
  52.   Result := FName;  
  53. end;  
  54.   
  55. procedure TBase.SetName(const AName: string);  
  56. begin  
  57.   FName := AName;  
  58. end;  
  59.   
  60. end

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多