소멸자(컴퓨터 프로그래밍)
Destructor (computer programming)객체 지향 프로그래밍에서 소멸자(destrator, 때로는 약칭 dtor[1])는 객체의 메모리가 해제되기 직전에 기계적으로 호출되는 방법이다.[2]그것은 그것의 수명이 범위에 묶여 실행에서 벗어날 때, 그것이 수명이 끝나는 다른 물체에 내장되었을 때, 또는 동적으로 할당되어 명시적으로 해제되었을 때 일어날 수 있다.이것의 주요 목적은 개체 수명 동안 개체로부터 획득한 리소스(메모리 할당, 열린 파일 또는 소켓, 데이터베이스 연결, 리소스 잠금 등)를 자유롭게 하거나 참조를 유지할 수 있는 다른 개체로부터 등록을 취소하는 것이다.디스트레이터의 사용은 자원 획득이 초기화(RAIII) 과정에 필요하다.
대부분의 종류의 자동 가비지 수집 알고리즘으로, 메모리 방출은 물체에 접근할 수 없게 된 후 오랜 시간 후에 일어나 대부분의 목적에 적합하지 않은 파괴자(이 경우 최종 결정자)를 만들 수 있다.이러한 언어에서 자원의 자유화는 어휘 구성을 통해 이루어진다(예: 시도).마지막으로 Python의 "with" 또는 Java의 "try-with-resource"는 RAII에 해당하거나 함수를 명시적으로 호출하여(명시적 삭제와 동일), 특히 많은 객체 지향 언어들이 Delete 패턴을 사용한다.
소멸자 구문
- C++: 소멸자는 연관된 클래스와 이름이 동일하지만 틸드(~) 접두사를 사용한다.[2]
- D: 소멸자가 이름으로 선언됨
~this()
(시공자는 다음과 같이 선언된다.this()
). - 객체 Pascal: 소멸자에게 키워드가 있음
destructor
그리고 사용자 정의 이름을 가질 수 있지만 대부분 이름이 지정되어 있다.Destroy
. - 목표-C: 소멸자 메서드에 이름이 있음
dealloc
. - Perl: 소멸자 메서드에 이름이 있음
DESTROY
; Mosse 객체 시스템 확장에서는 이름이 지정됨DEMOLISH
. - PHP: PHP 5+에서 소멸자 방법은 이름을 갖는다.
__destruct
PHP의 이전 버전에는 파괴자가 없었다.[3] - 파이톤: 있다
__del__
파이톤 2 언어 가이드에 의해 파괴자라고 불리는 방법들,[4] 그러나 그것들은 파이톤 3에서 인정된 것처럼 사실상 최종 결정자들이다.[5] - 녹: 녹의 소멸기법에는 이름이 있다.
drop
[6] - 스위프트: 소멸자 메서드에 이름이 있음
deinit
.
C++인
파괴자는 계급과 이름이 같지만 그 앞에 틸드(~)가 있다.[2]예를 들어, foo라는 클래스는 파괴자를 가질 것이다.~foo()
추가적으로 소멸자는 매개변수나 반환 형식을 가지고 있지 않다.[2]위에서 설명한 바와 같이, 사물의 수명이 끝날 때마다 사물의 파괴자를 부른다.[2]객체가 자동변수로 생성된 경우 객체의 수명이 종료되고 객체가 범위를 벗어나면 소멸자가 자동으로 호출된다.C++에는 가비지 컬렉션이 없기 때문에 객체가 다음과 같이 생성된 경우
명령문(더미에 표시됨), 그 소멸자는 다음과 같은 경우에 호출된다.new
오퍼레이터가 객체에 대한 포인터에 적용된다.일반적으로 그러한 작동은 다른 소멸자, 즉 일반적으로 스마트 포인터 개체의 소멸자 내에서 발생한다. delete
상속 계층 구조에서 기본 클래스의 가상 소멸자 선언은 기본 클래스에 대한 포인터를 통해 개체가 삭제될 때 파생 클래스의 소멸자가 적절하게 호출되도록 보장한다.이러한 방식으로 삭제될 수 있는 개체는 가상 소멸자를 상속해야 한다.
파괴자는 절대 예외를 던져서는 안 된다.[7]
예
#include <시스트링> #include <아이오스트림> 계급 푸 { 공중의: 푸(): data_(새로운 마를 뜨다[의 크기("안녕, 월드!")]) { 찌꺼기::층층적인(data_, "안녕, 월드!"); } 푸(경시하다 푸& 타사의) = 삭제하다; // 복사 시공 사용 안 함 푸& 운영자=(경시하다 푸& 타사의) = 삭제하다; // 할당 사용 안 함 ~푸(공허하게 하다) { 삭제하다[] data_; } 사유의: 친구 찌꺼기::오스트림& 운영자<<(찌꺼기::오스트림& os, 경시하다 푸& foo) { os << foo.data_; 돌아오다 os; } 마를 뜨다* data_; }; 인트로 본래의() { 푸 foo; 찌꺼기::뻐드렁니가 나다 << foo << 찌꺼기::끝을 맺다; }
안전하게 복사 및/또는 할당될 수 없는 개체는 공개 캡슐화 수준 내에서 삭제된 해당 기능을 선언하여 그러한 의미론에서 비활성화해야 한다.이 방법에 대한 자세한 설명은 Scott Meyers의 인기 책인 Effective Modern C++에서 찾을 수 있다(항목 11: "사적으로 정의되지 않은 것에 대해 삭제된 함수를 선호한다").[8]
GCC 확장이 있는 C 내
GNU 컴파일러 컬렉션의 C 컴파일러에는 파괴자를 구현할 수 있는 두 가지 확장 기능이 제공된다.
- 그
destructor
함수 속성은[9] 전역 우선 순위 소멸자 함수를 정의할 수 있다: 다음과 같은 경우main()
반환, 이러한 함수는 프로세스가 종료되기 전에 우선순위로 호출된다.참고 항목:착취의 기술을 해킹하는 것.[10] - 정리 변수 속성을 사용하면 변수에 소멸기 함수를 연결할 수 있으며, 변수가 범위를 벗어날 때 함수를 호출한다.
소조
Xojo(REALBASIC)의 파괴자는 두 가지 형태 중 하나일 수 있다.각 양식에는 특수 이름(매개변수 및 반환 값 없음)을 가진 정규 방법 선언이 사용된다.이전 형식은 ~(틸드) 접두사가 있는 클래스와 동일한 이름을 사용한다.새로운 형태는 그 이름을 사용한다.Destructor
새로운 형태는 수업을 리팩터링하는 것을 더 쉽게 해주기 때문에 선호된다.
클래스 Foobar // 이전 형식 Sub ~Foobar() End Sub // 새 형식 Sub Destructor() End Sub End Class
참고 항목
참조
- ^ "dtor". TheFreeDictionary.com. Retrieved 2018-10-14.
- ^ a b c d e Sebesta, Robert W. (2012). ""11.4.2.3 Constructors and Destructors"". Concepts of Programming Languages (print) (10th ed.). Boston, MA, USA: Addison-Wesley. p. 487. ISBN 978-0-13-139531-2.
- ^ PHP 온라인 설명서의 생성자 및 소멸자
- ^ https://docs.python.org/2/reference/datamodel.html#object.__del__
- ^ https://docs.python.org/3/reference/datamodel.html#object.__del__
- ^ https://doc.rust-lang.org/stable/reference/destructors.html
- ^ GotW #47: 미수집 예외 2011년 7월 31일에 액세스됨.
- ^ Scott Meyers: 효과적인 모던 C++, 오라일리, ISBN 9781491903995
- ^ C "분쇄기" 함수 속성
- ^ Erickson, Jon (2008). Hacking the art of exploitation. No Starch Press. ISBN 978-1-59327-144-2.