Destructor Not Called

Mar 9, 2018 at 1:05pm
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;
}
Mar 9, 2018 at 1:11pm
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 Mar 9, 2018 at 1:17pm
Mar 9, 2018 at 3:05pm
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).
Mar 9, 2018 at 4:51pm
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;
}
Mar 9, 2018 at 5:32pm
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.