2013-05-30 2 views
0

난 그냥 내 응용 프로그램에서 함수를 만드는 방법에 대해 해요 델파이에 문제가있는이 기능은 문제가 내가 무료로 할 수없는 것입니다이메모리 누수가

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; 

같다 나는 메모리 누수의 문제와 2 ~ 3 분 후에 후 응용 프로그램 중지를 가질 수에 대한 함수의 밖으로 측면에서 TMyquery .... 나는 함수 내부의 TMyquery 객체를 해제 할 경우
하지만, 그때 내가 할 수있는 ' 함수 호출 외부에서 함수 결과를 얻지 않습니다.

+1

내가 할 거라고 .... 반환이 경우 메모리 관리자는이라는 이름의 변수를 어떤 메모리 누수를 해결할 수 Fields를 사용하여 누구든지 쿼리를 생성하고 해제하십시오. –

+0

필드는 쿼리와 관련이 있으므로 쿼리를 해제하고 필드를 사용할 수 없습니다. – 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' 변수를 사용합니다. –