2015-01-02 17 views
7

Trong đoạn mã sau, destructor được gọi là hai lần, trong khi các nhà xây dựng được gọi là một lần duy nhất:Tại sao hàm hủy được gọi nhiều hơn hàm tạo?

enum TFoo 
{ 
    VAL1, 
    VAL2 
}; 

class CFoo 
{ 

public: 
    TFoo mf; 

    CFoo() 
    { 
     cout<<"hi c'tor1\n"; 
     //mf = f; 
    } 
    CFoo(TFoo f) 
    { 
     cout<<"hi c'tor2\n"; 
     mf = f; 
    } 
    CFoo(TFoo &f) 
    { 
     cout<<"hi c'tor3\n"; 
     mf = f; 
    } 
    ~CFoo() 
    { 
     cout<<"bye\n"; 
    } 
}; 

int main() 
{ 
    vector<CFoo> v; 
    //v.assign(1, VAL1); 
    v.push_back(VAL1); 
} 

Các đầu ra mã:

hi c'tor2 
bye 
bye 

Tôi tìm thấy một tương tự question, mà đã đề cập đến các nhà xây dựng sao chép, vì vậy tôi đã thêm chúng, nhưng với cùng một kết quả. Bỏ ghi chú dòng //v.assign(1, VAL1); cũng không thay đổi bất kỳ thứ gì.

+4

bạn bỏ lỡ hàm tạo bản sao 'CFoo (const CFoo &)' – Jarod42

Trả lời

9

Nó ban đầu được xây dựng bằng cách sử dụng toán tử chuyển đổi ngầm giữa TFooCFoo, CFoo(TFoo f), và sau đó sử dụng mà đối tượng tạm thời để vượt qua nó để push_back để xây dựng các đối tượng trong các chai lọ bằng constructor sao chép mặc định hoặc di chuyển constructor, tuỳ thuộc vào việc bạn đang sử dụng C++ 11 (không hiển thị bất kỳ thứ gì). Sau đó, tạm thời bị phá hủy và cuối cùng là đối tượng trong container (với chính vùng chứa).

Bạn có thể xem nó here hoặc here (C++ 11) thậm chí tốt hơn.

Các vấn đề liên quan