델파이는 자동으로 메모리를 관리합니다
Integer, Boolean, Record, Enumeration 등과 같은 Delphi의 원자 변수는 범위 내의 메모리에 대해 컴파일러에 의해 자동으로 할당되고 범위를 벗어날 때 자동으로 해제됩니다. 또한 문자열, 변형, 동적 배열 및 인터페이스. 또한 Delphi에서 자동으로 관리됩니다.
이러한 변수는 인터페이스를 제외하고 모두 스택 에 저장됩니다. 또한 Variant는 VarArrayCreate와 같은 함수를 사용하여 프로그래머가 수동으로 생성합니다. 동적 배열도 SetLength와 같은 함수를 사용하여 프로그래머가 수동으로 생성하지만 두 경우 모두 프로그래머가 직접 해제할 필요는 없습니다.
또한 주목해야 할 또 다른 종류의 변수가 있는데, Threadvar를 사용하여 선언된 변수이고 그 범위는 스레드입니다. 이는 각 스레드가 하나의 스레드 로컬 저장소를 사용하도록 스레드 함수를 작성할 때 주로 사용됩니다.
프로그래머가 수동으로 관리하는 메모리
포인터 와 객체를 사용하려면 프로그래머가 수동으로 메모리를 적용하고 해제해야 합니다.
포인터에는 PChar, 포인터(형식이 지정되지 않은 포인터), 레코드 포인터, 변수 포인터(원자 변수를 가리키는), 함수 포인터(예: 콜백 함수, 전역 함수와 개체 메서드로 구분됨)가 포함됩니다. New 함수를 사용하여 메모리를 적용하고 Dispose를 사용하여 포인터를 해제합니다. 또한 GetMem, ReallocMem 및 FreeMem도 메모리 적용 및 해제를 위한 일련의 함수입니다. GetMemoryManager 및 SetMemoryManager 함수를 통해 델파이의 세 가지 메모리 관리 기능을 읽고 설정할 수 있습니다.
객체에는 두 상속 트리인 TObject와 IUnknown에서 상속된 하위 클래스 객체가 포함됩니다. 객체는 생성자 메서드를 사용하여 생성되어야 합니다. 생성자 메소드를 사용하여 생성된 객체에 대해 소유자를 지정하지 않는 경우(보통 Create이지만 그렇지 않을 수도 있음, 델파이 컴파일러는 생성자 키워드만 인식함) 소유자를 직접 지정하더라도 수동으로 해제해야 합니다. 여전히 실제 상황을 확인해야 합니다. 특정 순간에 출시되어야 합니다. 일반적으로 해제에는 Free 메서드가 사용됩니다(IUnknown은 수동 해제가 필요하지 않습니다). 더 나은 방법은 FreeAndNil(Sysutils.pas 단위)을 사용하는 것입니다. 이 방법은 점유된 메모리를 해제할 뿐만 아니라 포인터 자체도 해제합니다.
이러한 변수는 힙 에 저장됩니다. 주의가 필요한 또 다른 문제는 TList의 포인터를 프로그래머가 직접 해제해야 한다는 것입니다.
메모:
1. 콜백 함수는 메모리 관리의 기술적 범위에 속하지 않습니다. 자세한 내용은 "포인터" 섹션을 참조하세요.
2. 객체에 대한 자세한 내용은 "객체 모델" 섹션을 참조하세요.
3. 포인터가 여러 곳에서 사용되는 경우, 그 중 한 곳이 해제되면 다른 곳에서 사용하면 예외가 발생하게 된다. 이는 포인터를 사용할 때 주의해야 할 문제이다. 자세한 메모리 정보는 "포인터" 섹션을 참조하세요.
4. 포인터 전달에는 메모리 절약과 속도 향상이라는 두 가지 확실한 이점이 있습니다. 자세한 메모리 정보는 "포인터" 및 "디자인 팁" 섹션을 참조하세요.
5. 객체와 포인터를 판단하는 방법은 매우 기술적인 주제입니다. csdn에는 이 주제에 대한 몇 가지 게시물이 있습니다. Aimingoo([email protected])가 작성한 "포인터 여부를 감지하는 방법"이라는 제목의 기사도 볼 수 있습니다. "객체에 대한 심층적 논의"라는 기사입니다. 자세한 메모리 정보는 "포인터" 및 "객체" 섹션을 참조하세요.
2004년 1월 19일 완료 .
모든 권리는 보호됩니다. 부적절한 댓글은 언제든지 수정해 주시기 바랍니다.