Why isn’t the destructor called at the end of scope?

I was wondering why the destructors of the classes SoundIC7410 and SoundSoft66 are not called at the end of the scope.

int main(int argc, char *argv[]) {
	vector <Sound*> soundlist;
	soundlist.push_back( new SoundIC7410{argv[1]} );
	soundlist.push_back( new SoundSoft66{argv[2]} );

	argc = 1;			/* just for the next line */
	Glib::RefPtr < Gtk::Application > app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
	MyWindow win(soundlist);
	return app->run(win);
}
% ./Rig011 hw:2,0 hw:1,0 /dev/ttyUSB1 &> log.txt
% tail log.txt
Sound::asound_read(): loop_count = 2, frames_actually_read = 2048
Sound::asound_read(): in the while loop, avail = 152

The answer is here:http://www.stroustrup.com/bs_faq2.html#delete-scope

That is, there was some (mistaken) assumption that the object created by “new” would be destroyed at the end of a function.
If you want an object to live in a scope only, don’t use “new” but simply define a variable.

So if I try:

int main(int argc, char *argv[]) {
	vector <Sound*> soundlist;
	SoundIC7410 sound1(argv[1]);
	SoundSoft66 sound2(argv[2]);
	soundlist.push_back(&sound1);
	soundlist.push_back(&sound2);

	argc = 1;			/* just for the next line */
	Glib::RefPtr < Gtk::Application > app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
	MyWindow win(soundlist);
	return app->run(win);
}

We get:

% ./Rig011 hw:2,0 hw:1,0 /dev/ttyUSB1 &> log.txt
% tail log.txt
Sound::asound_read(): loop_count = 2, frames_actually_read = 2048
Sound::asound_read(): in the while loop, avail = 112
SoundSoft66::~SoundSoft66() destructor.. 
SoundIC7410::~SoundIC7410() destructor.. 

Or more simply, try this:

int main() {
	Test  test10, test11;
	Test* test20 = new Test;
	Test* test21 = new Test;
	cout << "test10 = " << &test10 << ", test11 = " << &test11 << endl;
	cout << "test20 = " <<  test20 << ", test21 = " <<  test21 << endl;
	return 0;
}

Test::Test()  { cout << "aaa \n"; }
Test::~Test() { cout << "zzz \n"; }
aaa 
aaa 
aaa 
aaa 
test10 = 0x7ffd56299f50, test11 = 0x7ffd56299f60
test20 = 0x1f8b010, test21 = 0x1f8b030
zzz 
zzz 

Leave a Reply

Your email address will not be published. Required fields are marked *