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

ID: Q92500


The information in this article applies to:
  • The Microsoft C/C++ Compiler supplied with:
  • Microsoft C/C++ for MS-DOS
  • Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52
  • Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 4.1, 4.2, 5.0, 6.0


SUMMARY

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);
} 

Additional query words: 8.00 8.00c 9.00 9.10

Keywords : kbLangCPP kbVC100 kbVC150 kbVC151 kbVC152 kbVC200 kbVC210 kbVC400 kbVC410 kbVC420 kbVC500 kbVC600
Version : MS-DOS:; WINDOWS:1.0,1.5,1.51,1.52; winnt:1.0,2.0,2.1,4.0,4.1,4.2,5.0,6.0
Platform : MS-DOS WINDOWS winnt
Issue type : kbprb


Last Reviewed: October 15, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.