소멸자(컴퓨터 프로그래밍)

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+에서 소멸자 방법은 이름을 갖는다.__destructPHP의 이전 버전에는 파괴자가 없었다.[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

참고 항목

참조

  1. ^ "dtor". TheFreeDictionary.com. Retrieved 2018-10-14.
  2. ^ 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.
  3. ^ PHP 온라인 설명서의 생성자소멸자
  4. ^ https://docs.python.org/2/reference/datamodel.html#object.__del__
  5. ^ https://docs.python.org/3/reference/datamodel.html#object.__del__
  6. ^ https://doc.rust-lang.org/stable/reference/destructors.html
  7. ^ GotW #47: 미수집 예외 2011년 7월 31일에 액세스됨.
  8. ^ Scott Meyers: 효과적인 모던 C++, 오라일리, ISBN 9781491903995
  9. ^ C "분쇄기" 함수 속성
  10. ^ Erickson, Jon (2008). Hacking the art of exploitation. No Starch Press. ISBN 978-1-59327-144-2.