C++の質問してもいいですよね?
下記のソースプログラム(program1)の実行結果が,以下ようになりました.
0xbfefc33f call
0xbfefc33d call
0x9335008 now
0xbfefc33d call
0x9335009 now
0xbfefc33d call
0x933500a now
0xbfefc33d call
0x933500b now
0xbfefc33d call
0x933500c now
0x9335008 call
0x9335009 call
0x933500a call
0x933500b call
0x933500c call
ここでいくつか質問なんですが,
1.なぜなにも操作していないのに1行目でデストラクタが呼ばれてるのでしょうか?
2.t = Test();配列の初期化をこのようにしてるのですが,毎回デストラクタが呼ばれるのはなぜでしょうか?
program1
#include<iostream> #include<vector> class Test { public: ~Test() {std::cout << this << " call" << std::endl;} }; int main(void) { std::vector<Test> t(5); for(int i = 0; i < 5; i++) { t = Test(); std::cout << &t << " now" << std::endl; } return 0; }
プログラムを少し改造して
#include<iostream> #include<vector> class Test { public: ~Test() {std::cout << this << " call" << std::endl;} }; int main(void) { std::vector<Test> t(5); // 1回目 for(int i = 0; i < 5; i++) { t = Test(); std::cout << &t << " now" << std::endl; } std::cout << " = " << std::endl; // 2回目 for(int i = 0; i < 5; i++) { t = Test(); std::cout << &t << " now" << std::endl; } return 0; }
このようにします.
配列tを2回初期化していますが,1回目で確保されたメモリ領域はまだ確保されたままですよね?
だとしたら,かなり無駄なのでt.clear();をしてみたんですが,結果が
#clear()関数は配列のサイズまで変化しませんよね?
0xbfda0fcf call
0xbfda0fcd call
0x9e5a008 now
0xbfda0fcd call
0x9e5a009 now
0xbfda0fcd call
0x9e5a00a now
0xbfda0fcd call
0x9e5a00b now
0xbfda0fcd call
0x9e5a00c now
=
0x9e5a008 call
0x9e5a009 call
0x9e5a00a call
0x9e5a00b call
0x9e5a00c call
0xbfda0fcc call
0x9e5a008 now
0xbfda0fcc call
0x9e5a009 now
0xbfda0fcc call
0x9e5a00a now
0xbfda0fcc call
0x9e5a00b now
0xbfda0fcc call
0x9e5a00c now
このようになりました.=以降が2回目なんですが,たしかにclear後はデストラクタが呼ばれていますが
3.プログラムが終了するときにデストラクタが呼ばれていません.これはなにがおこってるのでしょうか?
ヨロシクオネガイシマス...