Yes, it is memory leak in your case but you can avoid memory leak in cases where modeless dialog allocated on the heap by making use of overriding PostNcDestroy.
Dialogs are not designed for auto-cleanup ( where as Main frame windows, View windows are).
In case you want to provide the auto-cleanup for dialogs then you must override the PostNcDestroy member function in your derived class. To add auto-cleanup to your class, call your base class and then do a delete this. To remove auto-cleanup from your class, call CWnd::PostNcDestroy directly instead of the PostNcDestroy member in your direct base class.
void MyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
How this works (from MSDN):
When destroying a Windows window, the
last Windows message sent to the
window is WM_NCDESTROY. The default
CWnd handler for that message
(CWnd::OnNcDestroy) will detach the
HWND from the C++ object and call the
virtual function PostNcDestroy. Some
classes override this function to
delete the C++ object.
"delete this" will free any C++
memory associated with the C++ object.
Even though the default CWnd
destructor calls DestroyWindow if
m_hWnd is non-NULL, this does not lead
to infinite recursion since the handle
will be detached and NULL during the
cleanup phase.
You can also refer MSDN (Destroying Window Objects ) for further details.
Note:
This works for modeless dialog that can be allocated on the heap.