{{위키데이터 속성 추적}}
'''소멸자'''(消滅子, {{Llang|en|destructor}})는 [[객체 (컴퓨터 과학)|객체]]가 소멸될 때 자동으로 발생하는 [[메소드 (컴퓨터 프로그래밍)|메소드]]이다. 이것은 생명 주기가 다른 객체에 삽입되었거나 동적으로 할당돼서 명시적으로 풀려나는 경우에, 자신의 생명주기가 범위에 묶여있고 실행이 [[변수 영역]]을 떠날 때 발생한다. 소멸자의 주요 목적은 자원을 할당 놓는(free) 것이며(메모리 할당, 오픈된 파일이나 소켓들, 데이터베이스 연결들, 자원 락 등), 이것은 객체에 의해 다른 엔티티에서 등록된 것을 자신의 생명주기에 따라 획득된 것이다. 소멸자의 사용은 [[RAII]](자원의 획득은 초기화이다: Resource Acquisition Is Initialization)의 개념에 필요하다.

쓰레기 수집 (컴퓨터 과학) 메커니즘을 사용하는 언어에서, 이것은 결정론적으로, 소멸자가 실행된다고 확신하기 힘들며, 그에 따라 이러한 언어들은 일반적으로 RAII에 적합하지 않다고 여겨진다. 이러한 언어들에서 객체를 존재하는 자원에서 링킹 해제하는 것은 반드시 적절한 함수의 명시적인 호출에 의하여야 한다(주로 <code>Dispose()</code>의 호출에 의한). 이 방식은 또한 자원을 놓을 때 파이널라이저를 사용하는 것 대신 추천되는 방식이다.

== 소멸자 문법 ==
* [[C++]]은 이름을 지을 때의 관습이 있는데, 이것은 소멸자가 관련되는 클래스와 같은 이름을 가지며, [[물결표]]를 접두사로 삼아야 한다는 것이다.
* [[오브젝트 파스칼]]에서, 소멸자는 "<code>destructor</code>" 키워드를 가지며 사용자가 정의한 이름을 가질 수 있다(그러나 대부분의 경우 "Destroy"로 불린다.).
* [[펄]]에서, 소멸자 메소드는  ''DESTROY''라는 이름을 갖는다.
* [[파이썬]]에서, 소멸자 메소드는 ''__del__''라는  이름을 갖는다.<ref>[https://docs.python.org/2/reference/datamodel.html#object.__del__ https://docs.python.org/2/reference/datamodel.html#object.]</ref>
* [[오브젝티브-C]]에서, 소멸자 메소드는 "<code>dealloc</code>"라는 이름을 갖는다.
* [[PHP]] 5에서, 소멸자는 "<code>__destruct</code>"라는 이름을 갖는다. 이 전 버전에서는 소멸자가 존재하지 않는다.<ref name="php5cpnstructor">[http://www.php.net/manual/en/language.oop5.decon.php Constructors and Destructors], from PHP online documentation</ref>

== C++에서 ==
소멸자는 클래스와 같은 이름을 갖지만, 앞에 물결표(~)를 붙인다. 만약 객체가 자동 변수로 생성된다면, 소멸자는 자동적으로 이것이 변수 영역을 넘어섰을 때 호출된다. 객체가 new 표현식을 사용해서 생성되었다면, 이것의 소멸자는 delete 연산자가 객체에 대한 포인터에 적용될 때 호출된다. 보통 그 연산은 다른 소멸자 안에서 발생하는데, 이것은 일반적으로 스마트 포인터 객체이다.

상속 체계에서, 베이스 클래스에서의 [[가상 함수|가상 소멸자]]의 선언은 상속받은 클래스들의 소멸자들이 객체가 베이스를 가리키는 클래스를 통해 삭제되었을 때 적절히 호출된다는 것을 확신시켜 준다. 이 방식으로 삭제될 객체들은 가상 소멸자를 상속할 필요가 있다.

소멸자는 반드시 예외를 던지면 안된다.<ref>[http://www.gotw.ca/gotw/047.htm GotW #47: Uncaught exceptions] Accessed 31 July 2011.</ref>

=== 예시 ===
<syntaxhighlight lang="cpp">
#include <cstring>
#include <iostream>

class foo_t
{
	friend std::ostream & operator << ( std::ostream & os, foo_t const & foo )
	{
		os << foo.data;
		return os;
	}

private:
	char * data;
	foo_t( foo_t const & other );                // disable copy construction
	foo_t& operator = ( foo_t const & other );   // disable assignment

public:
	foo_t( void ) : data( new char[ 14 ] ) { std::strcpy( data, "Hello, World!" ); }
	~foo_t( void ) { delete [] data; }
};

int main()
{
	foo_t foo;
	std::cout << foo << '\n';
}
</syntaxhighlight>안전하게 복사되거나 맡겨진 객체들은  이 어구에서 반드시 비 공용(non-public) 캡슐화 수준 내에서 자신의 상응하는 함수를 정의함으로써 비활성화되어야 한다(위의 예시에서는 "private"). 이 기법의 자세한 기법은 스캇 메이어의 유명한 책인, ''Effective C++'' (Item 6: "Explicitly disallow the use of compiler-generated functions you do not want."<ref>Scott Meyers: ''Effective C++'', Addison-Wesley, [[:en:Special:BookSources/0321334876|ISBN 0-321-33487-6]]</ref>)에서 찾을 수 있다.

== C에서 GCC 확장들= ==
[[GNU 컴파일러 모음]]의 [[C (프로그래밍 언어)|C]] 컴파일러에는 소멸자를 구현하는 두 확장들이 있다:
* "destructor" 함수 속성은 글로벌 우선순위 소멸자 함수들을 정의하는 것을 허락한다:  ''main()'' 이 반환될 때, 이러한 함수들은 프로세스가 종료되기 전에 우선 순위 순서로 호출된다.<ref>{{서적 인용
 |last = Erickson
 |first = Jon
 |title = Hacking the art of exploitation
 |url = https://archive.org/details/hackingartofexpl0000eric_g6n4
 |publisher = No Starch Press
 |year = 2008
 |isbn = 1-59327-144-1}}</ref>
* "cleanup" 변수 속성은 소멸자 함수가 변수에 어태치하게 한다: 이 함수는 변수가 변수 영역을 넘어설 때 호출된다.

== 같이 보기 ==
* [[파이널라이저]]
* [[생성자]]
* [[객체 생명주기]]
* [[RAII]]

== 각주 ==
{{각주}}

[[분류:C++]]
[[분류:메소드 (컴퓨터 프로그래밍)]]