0

次のコードは、Food-destructor で (/after) クラッシュします。以下のスタックに示すように。

6 operator delete()  0xb7e5f4bf 
5 std::string::_Rep::_M_destroy()  0xb7ec648b   
4 <symbol is not available> 0xb7ec64d0  
3 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()  0xb7ec653e   
2 Food::~Food() Main.cpp:126 0x0804c33c 
1 main() Main.cpp:199 0x0804c288    

Food-ctor は呼び出されませんが、デストラクタは呼び出されますか? AFAICT「string _text」のリソースが解放されると、事態は混乱しますが、なぜこれがうまくいかないのか理解できないようです。明らかに、「string _text」を「string* _text」に変更できますが、なぜこれがうまくいかないのかを理解したいと思います。

class Food {
private:
    string _text;
public:
    Food(){
        cout << "ctor Food" << endl;
    }
    Food(string name) {
        cout << "ctor Food: name=" << name << endl;
    }

    virtual ~Food() {
        cout << "dtor Food" << endl;
    }
};

template<typename T>
class Action {
public:
    static T eat(int i) {
        cout << "Eat: " << i << endl;
    }
};

int main() {
    auto x = Action<Food>::eat(1);
}
4

1 に答える 1

4

あなたがしているのは未定義の振る舞いです。関数(eat)を型を返すものとして定義しTますが、実際には何も返しません。これにより、割り当てが未定義になります。

于 2012-12-24T03:17:06.333 に答える