WinCE 의 MFC OnDestroy 함수에 대해서...

wmjj의 이미지

Wince에서 MFC, SDI, CFormView으로 설정하여 비주얼스튜디오 2008로 샘플 프로그램을 만들었습니다.
vs2008에서 자동으로 만들어주는 프로그램이요..

그리고 리소스뷰를 열어 Form에다가 에디트박스 하나를 추가한 후 아래와 같은 클래스를 사용해
OnDestroy 함수를 서브클래싱 했습니다.

////////////////////////////////////////////////////////////////
## 헤더 파일
////////////////////////////////////////////////////////////////
class CSubClassEDIT : public CEdit
{
DECLARE_DYNAMIC(CSubClassEDIT)

public:
CSubClassEDIT();
virtual ~CSubClassEDIT();

protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDestroy();
};

////////////////////////////////////////////////////////////////
## cpp 파일.
////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CSubClassEDIT, CEdit)
CSubClassEDIT::CSubClassEDIT() {
OutputDebugString(_T("에디트생성!!!!!!!\r\n"));
}

CSubClassEDIT::~CSubClassEDIT() {
OutputDebugString(_T("에디트소멸!!!!!!!!!\r\n"));
}

BEGIN_MESSAGE_MAP(CSubClassEDIT, CEdit)
ON_WM_DESTROY()
END_MESSAGE_MAP()

void CSubClassEDIT::OnDestroy() {
CEdit::OnDestroy();
OutputDebugString(_T("........OnDestroy에디트\r\n"));
}

궁금한점은요.
wince에서는 프로그램이 종료되도 차일드 윈도우(에디트)의 OnDestroy함수가 호출이 되지 않습니다.
동일한 방법으로 wince 프로젝트가 아닌 PC용 프로젝트로 만들어서 테스트하면 OnDestroy가 호출 됩니다.

그렇다면 wince에서는 프로그램 종료시마다 매번 메모리 누수가 발생하고 있다는건가요?
제 테스트 방법이 잘못된건가요?

고수님들 설명 좀 부탁 드립니다.

mirheekl의 이미지

프로세스 종료시에는 점유하던 자원이 모두 리턴됩니다. 소멸자가 호출이 되지 않더라도 마찬가지입니다. 따라서 일반적인 경우에는 OS입장에서는 누수가 일어나지 않습니다.

물론 OS가 직접 관리할 수 없는 영역의 자원을 사용하고 있었다면 문제가 될 수도 있습니다. 가령 서버에서 넘겨받은 핸들을 갖고 있다든지.. 허나 그렇다 해도 해당 자원상의 문제일뿐 클라이언트단의 메모리 누수는 일어나지 않겠죠.

또한 OnDestroy는 객체의 소멸자가 아니므로 객체 자체가 제대로 소멸되지 않는다고 판단할 근거도 없습니다. 만약 CSubClassEDIT::~CSubClassEDIT() 마저 호출이 되지 않는다면 그건 뭔가 잘못된게 확실하지만요.

만약 일반적인 상황에서는 소멸자가 잘 호출되는데 프로그램 종료시에만 잘 호출이 되지 않는다면, 꺼림칙하긴 하지만 일단 당장 문제의 소지는 별로 없습니다. (물론 그래도 고치는 것이 좋습니다.)

하지만 일반적인 상황에서 CSubClassEDIT의 인스턴스를 제거했는데도 소멸자가 제대로 호출이 되지 않는다면 반드시 해결하고 넘어가야 합니다.

--

wmjj의 이미지

감사합니다.
참고하도록 하겠습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.