提示コードですがmain関数の処理をすると提示画像のような結果になるのですがこの3つの処理がなぜどのような理由で起こっているのか知りたいです。一時オブジェクトを生成するのでまずコンストラクタが起きてその次にコピーするのでコピーコンストラクタもわかります
その後の2つのデストラクタの順序とその理由が知りたいです。
cpp
1#include "stdio.h" 2#include "glm/glm.hpp" 3#include <array> 4#include <vector> 5#include <iostream> 6#include "conio.h" 7 8using namespace std; 9 10class test { 11public: 12 test(int a) 13 { 14 15 } 16}; 17 18class Bullet { 19public: 20 21 //コンストラクタ 22 Bullet(int r) { 23 a = new test(3); 24 printf("コンストラクタ\n"); 25 } 26 27 //デストラクタ 28 ~Bullet() { 29 delete a; 30 a = nullptr; 31 printf("--- デストラクタ\n"); 32 } 33 34 //コピーコンストラクタ 35 Bullet(const Bullet& obj) 36 { 37 printf("コピーコンストラクタ\n"); 38 a = new test(3); 39 } 40 41private: 42 43 test* a; 44 45}; 46 47 48int main() 49{ 50 51 std::vector<Bullet> bullet; 52 bullet.push_back(Bullet(4)); 53 54 55 56 return 0; 57}
せめて「続きは独立した質問にします」ぐらいのコメントはください。
https://teratail.com/questions/318749#reply-443389
すいませんでした。
なにが問題なのかわからない。
「コンストラクタがふたつ動いたから、デストラクタもふたつ動いた」のどこに疑問があるのでしょうか。
なるほど
"なるほど"じゃネーヨ。なにが疑問/問題なんです?
どうしてデストラクタが二回なのか合って思ったんですけどそれ聞いてすっきりしました。
一時オブジェクト?は、使用箇所のスコープのローカル変数として実装されている事が多い[要出典]ので、スコープ抜けるタイミングでデストラクタが動きますよ。
この場合のスコープは、push_back()なのか、main{}なのかは分かりませんが、
確認したければデバッガでトレース実行してみてください。
> 一時オブジェクト?は、使用箇所のスコープのローカル変数として実装されている事が多い[要出典]ので、
いえ、一時オブジェクトの寿命はその式の中だけです。次の行に進む前にデストラクタが走ります。
> ...それ聞いてすっきりしました。
解決したのなら、適切に close してください。
回答1件
あなたの回答
tips
プレビュー