2013-05-30 21 views
0

我只是用Delphi一個問題,我是如何創建我的應用程序的函數,這個函數是這樣內存泄漏從函數返回時中tfields

function Get_Foundation_infos(): TFields; 
begin 
    with TMyQuery.Create(nil) do 
    begin 
    try 
     Connection := DataBaseForm.DataBaseForm1.DataBase; 
     SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1'); 
     Execute; 
     Result := Fields; 
    except 
     on E: Exception do 
     Result := nil; 
    end; 
    end; 
end; 

問題是我不能免費TMyquery從功能的外側,我有一個內存泄漏的問題,並在2或3分鐘後的應用程序停止....
但如果我免費TMyquery對象裏面的函數,那麼我可以' t從函數調用的外部獲取函數結果。

+1

我讓無論使用字段創建並釋放查詢。 –

+0

字段與Query相關,因爲您無法釋放查詢並使用字段。 – Oussaki

+3

Sertac表示調用者創建查詢,然後調用傳遞查詢對象的函數。然後你運行窗體並執行查詢並返回。然後來電者在田野上探出頭來。最後,調用者銷燬查詢。 –

回答

6

您需要確保TMyQuery對象超出它擁有的TFields對象。但是,您還必須確保銷燬該TMyQuery對象以避免泄漏。

最簡單的方法是從函數中返回TMyQuery對象並讓調用者讀取Fields屬性。完成後,銷燬TMyQuery對象。自然,你會使用try/finally來確保異常不會導致泄漏。

function CreateFoundationQuery: TMyQuery; 
begin 
    Result := TMyQuery.Create(nil); 
    try 
    Result.Connection := DataBaseForm.DataBaseForm1.DataBase; 
    Result.SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1'); 
    Result.Execute; 
    except 
    Result.Free; 
    raise; 
    end; 
end; 
0

我剛剛找到另一種方式也許當我創建了一個對象,而它使用一個名稱參考變量是內存管理器無法修復的內存泄漏在這種情況下爲我創建的具有可變功能相同類型的返回,在這種情況下,內存管理器可以解決與此命名變量任何內存泄漏....

這是可變的新代碼...

function Get_Foundation_infos(): TMyQuery; 
var 
    q: TMyQuery; 
begin 
    q := TMyQuery.Create(nil); 

    with q do 

    begin 

    try 

     Connection := DataBaseForm.DataBaseForm1.DataBase; 

     SQL.Add('SELECT * FROM `foundation_infos` WHERE `Id`=1'); 
     Execute; 

     Result := q; 

    except 
     on E: Exception do 
     Result := nil; 
    end; 

    end; 

end; 
+4

這與我的回答相同,只是在創建查詢後引發異常時,代碼會泄漏。 –

+0

是的,我必須打電話給免費的;當異常提出時。 – Oussaki

+3

@David:這段代碼使用了一個不需要的'q'變量,你的不需要。 –