Destructor Not Called

Why wasn't the destructor not called automatically? See output.

Constructor called.
Constructor called.
Constructor called.
Constructor called.
Constructor called.
Constructor called.
Constructor called.
Volume of cigar is 40
Volume of boxes[2] is 1.21
Press any key to continue . . .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Ex8_01.cpp
// Class with an explicit destructor
#include <iostream>
using std::cout;
using std::endl;

class CBox                     // Class definition at global scope
{
public:
  // Destructor definition
  ~CBox()
  {
    cout << "Destructor called." << endl;
  }

  // Constructor definition
  explicit CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0) :
    m_Length{ lv }, m_Width{ wv }, m_Height{ hv }
  {
    cout << "Constructor called." << endl;
  }

  // Function to calculate the volume of a box
  double volume() const
  {
    return m_Length*m_Width*m_Height;
  }

  // Function to compare two boxes which returns true
  // if the first is greater than the second, and false otherwise
  bool compare(const CBox* pBox) const
  {
    if (!pBox)
      return false;
    return this->volume() > pBox->volume();
  }

private:
  double m_Length;               // Length of a box in inches
  double m_Width;                // Width of a box in inches
  double m_Height;               // Height of a box in inches
};


// Function to demonstrate the CBox class destructor in action
int main()
{
	CBox boxes[5];                 // Array of CBox objects defined
	CBox cigar {8.0, 5.0, 1.0};   // Define cigar box
	CBox match {2.2, 1.1, 0.5};   // Define match box
	CBox* pB1 {&cigar};           // Initialize pointer to cigar object address
	CBox* pB2 {};                   // Pointer to CBox initialized to nullptr

	cout << "Volume of cigar is " << pB1->volume() << endl;

	pB2 = boxes;                   // Set to address of array
	boxes[2] = match;              // Set 3rd element to match

	cout << "Volume of boxes[2] is " << (pB2 + 2)->volume() << endl;
	
	system("pause");
	return 0;
}
The destructors are called when the main() function ends because that's when the objects go out of scope. Note that this is after system("pause");.

This is the output I get when running your program.

Constructor called.
Constructor called.
Constructor called.
Constructor called.
Constructor called.
Constructor called.
Constructor called.
Volume of cigar is 40
Volume of boxes[2] is 1.21
sh: pause: not found
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Destructor called.
Last edited on
Your actual problem is that you do let the console/terminal to close at the end of the program. The program does write output but that does not take long and the window closes so quickly that you simply have no time to see/read all of the output.

You do attempt to keep the console open on line 61, but the "action" is after line 62.
The system("pause"); has issues. See http://www.cplusplus.com/forum/beginner/1988/

None of those helps with your issue.


One could:

* Open a console and run program(s) there, "on command line". The console is not for the program and therefore won't close.

* Somehow rig the console to stay open even after program is completely over. Perhaps some IDE supports that.

* Redirect the standard output of the program into a file. The console will show nothing. The redirection is easy "on command line" (where you would not need it anyway).
or limit the scope, so they die before the system() call.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
	{ //<---

		CBox boxes[5];                 // Array of CBox objects defined
		CBox cigar {8.0, 5.0, 1.0};   // Define cigar box
		CBox match {2.2, 1.1, 0.5};   // Define match box
		CBox* pB1 {&cigar};           // Initialize pointer to cigar object address
		CBox* pB2 {};                   // Pointer to CBox initialized to nullptr

		cout << "Volume of cigar is " << pB1->volume() << endl;

		pB2 = boxes;                   // Set to address of array
		boxes[2] = match;              // Set 3rd element to match

		cout << "Volume of boxes[2] is " << (pB2 + 2)->volume() << endl;

	} //<--- the boxes die here
	
	system("pause");
	return 0;
}
Thank you all. I had suspected that the destructor executed but did not know why the output was not printed on screen. I even put in scoping brackets but put them in the wrong place. Thank you, ne555.
Topic archived. No new replies allowed.