12 デストラクタを手動で呼び出すことは、常に悪い設計の兆候ですか? 私は考えていました:彼らはあなたが手動でデストラクタを呼んでいるなら-あなたは何か間違ったことをしていると言います。しかし、それは常に当てはまりますか?反例はありますか?手動で呼び出す必要がある状況、またはそれを回避することが難しい/不可能/非現実的な状況ですか? 83 c++ coding-style destructor
2 関数オブジェクトを使用するC ++スレッド、複数のデストラクタはどのように呼び出されますが、コンストラクタは呼び出されないのですか? 以下のコードスニペットを見つけてください。 class tFunc{ int x; public: tFunc(){ cout<<"Constructed : "<<this<<endl; x = 1; } ~tFunc(){ cout<<"Destroyed : "<<this<<endl; } void operator()(){ x += 10; cout<<"Thread running at : "<<x<<endl; } int getX(){ return x; } }; int main() { tFunc t; thread t1(t); if(t1.joinable()) { cout<<"Thread is joining..."<<endl; t1.join(); } … 15 c++ multithreading destructor
2 デストラクタが2回実行されたのはなぜですか? #include <iostream> using namespace std; class Car { public: ~Car() { cout << "Car is destructed." << endl; } }; class Taxi :public Car { public: ~Taxi() {cout << "Taxi is destructed." << endl; } }; void test(Car c) {} int main() { Taxi taxi; test(taxi); return 0; } これが出力されます: … 12 c++ inheritance visual-studio-2017 destructor pass-by-value
5 ループ内のローカルオブジェクトのデストラクタは、次の反復の前に呼び出されることが保証されていますか? ループがあり、このループ内で新しいスタック変数を作成すると(ヒープ上に割り当てず、ループ本体内で宣言された変数を保持する変数ではありません)、このオブジェクトのデストラクタは、次の反復が始まる前に呼び出されることが保証されます。コンパイラによるループの展開はそれについて何かを変更しますか? 11 c++ destructor
3 デストラクタでの動的キャスト このコードは合法ですか? class Base1 { }; class Base2 { public: virtual ~Base2() { if (!dynamic_cast<Base1*>(this)) std::cout << "aaaa" << std::endl; } Base2() { } }; class MyClass: public Base1, public Base2 { public: MyClass() { } virtual ~MyClass() { std::cout << "bbb" << std::endl; } }; int main() { MyClass s; … 8 c++ polymorphism destructor multiple-inheritance dynamic-cast