exit 함수로 프로그램 종결시 처리되는 것들..

dltkddyd의 이미지

exit로 종결하면, 객체가 소멸되면서 프로그램이 종결된다고 하던데요. 객체를 위해 동적으로 할당된 메모리가 있다고 했을 때, 메모리도 같이 반환되면서 객체가 소멸되는지 궁금합니다. 가령 클래서 AClass가 있다고 했을 때

AClass* tmp=new AClass();
exit(0);

라고 했을 때에 메모리 누수 문제가 발생하지 않는지 궁금합니다. 혹시 메모리가 누수된다면 컨테이너를 사용해야만 할 것 같은데요. 컨테이너 사용하지 않고 동적할당 메모리를 정리할 수 있는 방법은 없을까요?

klyx의 이미지

소멸이라는 게 뭘 가리키는건가요? 소멸자는 호출되지 않고 (메모리 관리가 제대로 되는 운영체제라면) 메모리는 회수됩니다.

dltkddyd의 이미지

AClass에서

~AClass() {}

로 언급된 멤버함수를 말씀드리는 건데요. 요지는 exit 할 때 소멸자는 호출되지 않는다는 말씀이죠? 그런데 제가 처음에 언급했던

AClass* tmp=new AClass;

라면 반드시 프로그램 종료전에

delete tmp;

를 해서 동적할당 메모리를 회수해야 되는데, exit(0)을 언급하고 프로그램을 종료한다면 동적으로 할당된 메모리를 인위적으로 해제하지 않아도 exit 함수가 실행되면 new AClass로 할당된 메모리가 회수되는 건가요. 그러니까 exit 함수 실행 뒤에 프로그램 종결 전까지의 어느 시점에서

delete tmp

와 비슷한 동작이 실행되는 것인지요?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

klyx의 이미지

delete는 컴파일러가 소멸자를 호출하고 할당한 메모리를 운영체제에 반납하는 코드입니다. 소스코드에 없는 delete를 운영체제가 멋대로 집어넣지는 않습니다. 프로세스가 종료되면 운영체제가 거기에 할당한 메모리를 알아서 가져갑니다. delete한적 없으므로 당연히 소멸자는 호출되지 않습니다.

dltkddyd의 이미지

tmp가 가리키는 메모리가 회수가 된다는 말씀이죠? 그러면

delete tmp

라는 것 대신에

항상 exit(0)을 언급해도 tmp가 가리키는 메모리는 운영체제에 의해 회수되므로 결과는 delete tmp와 같다고 이해해도 될까요?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

mirheekl의 이미지

예를 들어 tmp의 생성자에서 C:\ABC.TXT에다가 "생성자"라는 내용을 기록하고 소멸자에서 "소멸자"라는 내용을 기록한다 칩시다.

new/delete 페어가 맞으면 C:\ABC.TXT에는 생성자 소멸자 라고 기록이 되겠지만, exit로 나가버리면 생성자라고만 기록되겠죠.

메모리는 회수되는게 맞지만요. 그리고 이 작업은 프로세스가 종료된 후에 진행됩니다.

--

klyx의 이미지

delete는 컴파일러가 소멸자호출하고 반납하는거라고 이미 말씀드렸습니다. 운영체제가 회수할때는 그냥 가져가는겁니다. 소멸자안부릅니다. 답변을 잘 읽어주세요.

mirheekl의 이미지

OS의 문제로 제대로 반납이 되지 않는 경우도 있지만 이건 논외로 치고..

OS를 통해서 받은 메모리는 다 반납됩니다. 하지만 여기에 의존해서 프로그램을 작성하는 건 좋은 생각은 아닌것 같습니다. 차후에 해당 코드가 확장되거나, 어떤 이유로든 예정된 시기에서 종료를 하지 않고 그냥 처음부터 다시 시작하거나 하는 등의 이유로 메모리 릭을 발생시킬 수가 있거든요.

정 그부분의 처리가 번거로우시면 스마트 포인터류를 이용하시거나 자동변수(new/delete를 쓰지 않고 객체를 선언)를 활용하시거나 하면 좋을듯 합니다. 즉, 소멸자 호출이 보장되는 방법들 중 하나를 쓰시면 좋을듯 싶네요.

--

dltkddyd의 이미지

소멸자는 호출되지 않지만 운영체제가 정상적으로 메모리를 관리한다면, new 로 할당된 메모리는 프로세스 종료된 다음에 회수된다. 즉 OS가 불안정하면 회수되지 않을 수도 있으므로 스마트 포인터를 사용할 것을 권한다.
여러 답변 감사합니다. 메모리 회수에 대해 많이 배우고 갑니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

jick의 이미지

OS가 불안정하면 (x)
OS가 제대로 된 메모리 관리를 지원하지 못하면 (o) (최근 10년 새 출시된 데스크탑 운영체제라면 해당사항 없다고 보시면 됩니다.)

mirheekl의 이미지

- OS가 프로세스별로 직접 관리하지 않는 자원에 릭이 일어날 가능성
- 차후에 프로그램 용도가 변경될 가능성

때문에 거기에 의존하지 말라는 것입니다. 메모리가 아닌 부분에 대해 다들 말씀을 해주셨는데 살짝 메모리에만 집중하고 계신듯 합니다. :)

--

gilgil의 이미지

> exit로 종결하면, 객체가 소멸되면서 프로그램이 종결된다고 하던데요.
아뇨.

> tmp가 가리키는 메모리가 회수가 된다는 말씀이죠? 그러면 delete tmp 라는 것 대신에 항상 exit(0)을 언급해도 tmp가 가리키는 메모리는 운영체제에 의해 회수되므로 결과는 delete tmp와 같다고 이해해도 될까요?
아뇨.

OS가 프로세스의 resource(메모리)를 회수한다는 것과 C++ destructor가 호출이 된다는 것을 동일시하면 안되죠.

C++의 관점에서 : exit 함수가 호출되면 C++ destructor가 호출되지 않음. ( http://www.gilgil.net/3395 )

OS의 관점에서 : (exit 함수와 상관 없이) 프로세스가 종료되면 해당 프로세스가 가지고 있던 모든 자원이 OS에게 반환됨(mem, mutex, thread, 각종 handle 등등).

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.