PRB: exit() Function Does Not Clean Up Nonstatic Objects (92500)



The information in this article applies to:

  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52
  • Microsoft Visual C++ 2.0
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++ 4.1
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.2
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0

This article was previously published under Q92500

SYMPTOMS

When an application calls the exit(), _exit(), _cexit(), or _c_exit() functions, the destructors for any temporary or automatic objects that exist at the time of the call are not called. The text below provides a sample program to demonstrate this behavior.

MORE INFORMATION

An automatic object is an object that is defined in a function where the object is not declared to be "static." A temporary object is an object created by the compiler.

To destruct an automatic object before calling exit(), explicitly call the destructor for the object, as follows:
   myObject.myClass::~myClass();
				

Sample Code

/* Compile options needed:  for 16-bit - /f /Od /Zi
*                           for 32-bit - none
*/ 

#include <iostream.h>
#include <process.h>

class myClass
{
   int nVal;

public:
   myClass();
   void View() {cout << nVal << "\n";};
   ~myClass();
};

myClass::myClass()
{
   nVal = 99;
}

myClass::~myClass()
{
   cout << "Destructor has been called\n";
}

void main(void)
{
   myClass myObject;

   myObject.View();

// Remove the comment from the next line to call the destructor
// myObject.myClass::~myClass();

   exit(0);
}
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbLangCPP kbprb KB92500