문제

함수 내에서 생성되고 함수가 완료된 객체가 완료되면 명시 적으로 파괴되지 않으면 객체는 어떻게됩니까?

모든 변수가 범위에서 벗어날 때 파괴되어야합니까, 아니면 범위에서 벗어날 때 관리됩니까?

예를 들어, Custom_Function이 호출 된 후 LocAllist는 어떻게됩니까?

function TForm1.custom_function(string: test_string): boolean;
var locallist: TStringList;
begin
  locallist := TStringList.Create;
  // do a bunch of stuff here, but don't destroy locallist
  return true;
end;
도움이 되었습니까?

해결책

메모리 누출이 발생합니다.

적절한 패턴은입니다

myObject := TObject.Create;
try
  //do stuff
finally
  myObject.Free;
end;

또한 물체가 해제 된 경우 나중에 테스트 해야하는 경우 FreeAndnil (MyObject)을 사용하십시오. 변수를 NIL로 설정하므로 나중에 테스트 할 수 있습니다.

다른 팁

다른 포스터가 언급했듯이,이 물건들은 명시 적으로 해제되어야합니다. 이것은 일반적으로 Ray가 보여준 것처럼 시도를 사용하여 수동으로 수행됩니다. 그러나 당신이 알아야 할 예외가 있습니다.

구성 요소 (Tcomponent Descendants)는 소유자 매개 변수를 생성자에게 전달합니다. 소유자가 아닌 경우 , 그러면 소유자 구성 요소는 새 구성 요소의 소유권을 가져 와서 해방 될 때 해방됩니다. 그렇기 때문에 자신의 형태를 정리할 필요가 없습니다. 그들은 응용 프로그램 개체에 연결되어 있으며 자유로운 방법을 알고 있습니다. 그 자체 프로그램이 완료되면. 그러나 런타임에 구성 요소를 작성하는 경우 소유자를 지정하거나 패스해야합니다. 생성자에게 그리고 직접 자유롭게 해제하십시오. 소유자와 구성 요소를 제거하여 둘을 혼합하지 마십시오. 특정 상황에서 이중 상태가 발생할 수 있습니다.

참조 계산 (주로 TinterfacedObject Descendants, 주로)을 구현하는 인터페이스 된 객체는 참조 계산 메커니즘에 의해 자유롭게 해제됩니다 (객체가 아닌) 마지막 인터페이스 참조가 제거 될 때 자동으로 해제됩니다. 이미 인터페이스 참조에 할당 한 경우 TinterfacedObject를 수동으로 자유롭게 해제하지 마십시오. 이것은 예외를 제기 할 것입니다. 또한 인터페이스가있는 모든 객체가 참조 계산을 구현하는 것은 아닙니다. 주로 주석에서 내려온 것입니다.

객체를 만들고 시도를 사용하는 것이 항상 실용적인 것은 아닙니다. 때로는 그것이 당신이하고있는 일에 대해서는 효과가 없다. 특히, 특히 객체를 어떤 종류의 목록에 할당하고 그 중 많은 것을 만드는 경우.이 경우 TobjectList를 사용하는 것이 좋습니다. 또는 더 나은, 당신이 d2009, tobjectlist가있는 경우, onsobjects 속성이 진실. 이로 인해 목록이 객체의 소유자가되고 구성 요소와 마찬가지로 해방 될 때 해방됩니다. 객체 목록이 소유 한 경우 객체를 수동으로 자유롭게 해제하지 마십시오.

동적 배열 (문자열 포함)은 참조 카운팅 시스템을 갖춘 컴파일러에서 관리하며 대부분의 다른 유형의 변수는 스택에 할당됩니다. 포인터를 가지고 놀지 않는 한, 물체 이외의 다른 것을 수동으로 자유롭게 해방하는 것에 대해 걱정할 필요가 없습니다.

이것은 아마도 복잡하게 들리지만 곧 익숙해 질 것입니다. 모든 객체는 다른 객체, 인터페이스 참조 카운팅 시스템 또는 코드의 세 가지 중 하나가 소유하고 있으며 소유자는 더 이상 필요하지 않을 때 모든 객체를 자유롭게해야합니다. 다른 사람이 소유 한 것을 자유롭게하려는 것은 없습니다. (너는 도둑질하지 않았다.)이 지침을 기억하면 좋은 메모리 관리가 될 것이다. DPR의 기본 루틴에서 "ReportMemoryLeakSonShutdown : = true"를 설정하여 좀 더 도움을 줄 수도 있습니다.

메모리가 유출됩니다.

일반적으로 그러한 할당을 둘러싸고 있어야합니다.

locallist := TStringList.Create;
try
     // work with locallist here
  finally
     locallist.Free;
  end; 

델파이의 유일한 종류의 언급은 범위를 벗어 났을 때 자살하는 유일한 참조는 인터페이스 참조입니다.

메모리가 되 찾을 수 없습니다. 죄송합니다. locallist.free를 사용 하여이 객체를 명시 적으로 자유롭게 해제해야합니다.

이것은 a를 초래할 것입니다 메모리 누출 신청이 끝날 때만 파괴됩니다. 그것들을 감지하려면 다음과 같은 메모리 관리자를 사용할 수 있습니다. FASTMM.

파괴 또는 자유 방법을 사용하여 물체를 파괴 할 수 있습니다. 첫 번째는 물체가 nil이면 오류가 발생합니다. 후자는 그렇지 않습니다.

if Assigned(Object) then Object.Destroy;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top