2013-01-16 27 views
6

Đã xảy ra sự cố trong chương trình của tôi và tôi không thể tìm thấy nó có xảy ra hay không. Và nếu nó là, tôi không hiểu tại sao ..Tại sao trình phá hủy được gọi khi khởi tạo và thay đổi kích cỡ một vectơ của các đối tượng?

Dưới đây là các mã:

#include <iostream> 
#include <vector> 

using namespace std; 

class A{ 
    public: 
    A(); 
    ~A(); 
}; 

A::A(){ 
    cout << "creating" << endl; 
} 

A::~A(){ 
    cout << "deleting" << endl; 
} 

int main(void){ 
    vector<vector<A > > vec; 

    vec.resize(5); 
    for(int i = 0; i < 5; ++i){ 
    vec[i].resize(5); 
    } 

    cout << "END" << endl; 

    return 0; 
} 

Và đây là kết quả:

creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
END 
deleting 
deleting 
[..more deleting here] 

Tôi hiểu tại sao các destructor được gọi sau khi " END "tin nhắn, nhưng trước đó, tôi không. Tôi nghĩ rằng khi vector thay đổi kích cỡ, hàm tạo của lớp được gọi, nhưng tại sao hàm hủy?

+0

Bạn quên định nghĩa người dùng bản sao ctor. Nếu bạn làm (với đầu ra) và đặt một đầu ra sau mỗi cuộc gọi để thay đổi kích thước(), bạn sẽ thấy những gì đang xảy ra. –

Trả lời

17

Trong C++ 03 vector<A>::resize() có thông số mặc định, với giá trị mặc định A(). Đó là tạm thời này đã bị phá hủy. Các phần tử của các vectơ được sao chép từ nó.

Đây là "cố định" trong C++ 11, trong đó có hai tình trạng quá tải là resize. Một có một tham số duy nhất và giá trị khởi tạo bất kỳ phần tử bổ sung nào. Cái kia có hai tham số, và sao chép-khởi tạo từng phần tử bổ sung từ giá trị được cung cấp. Trong C++ chương trình này 11 có hành vi này:

creating 
creating 
creating 
<repeated for a total of 25 "creating"s> 
creating 
creating 
creating 
END 
deleting 
deleting 
deleting 
<repeated for a total of 25 "deleting"s> 
deleting 
deleting 
deleting 

trong C++ 03, nếu một thể hiện của A rất đáng kinh ngạc tốn kém để xây dựng mà nó có giá trị giảm thiểu số lượng, sau đó bạn có thể cạo nó từ 5 không -args- + 25 sao chép công trình xây dựng xuống còn 1 không arg- và 25 bản sao-công trình xây dựng với một cái gì đó như thế này:

A default_value; 
for (int i = 0; i < 5; ++i) { 
    // same end result as vec[i].resize(5) 
    if (vec[i].size() >= 5) { 
     vec[i].erase(vec.begin() + 5, vec.end()); 
    } else while(vec[i].size() < 5) { 
     vec[i].push_back(default_value); 
    } 
} 

bạn có lẽ có thể viết nó hơi khác nhau, và rõ ràng cho mã ví dụ của bạn, bạn không cần trường hợp "nếu". Nhưng tôi không có nhiều cơ hội để nói "khác trong khi", vì vậy tôi đang dùng nó.

+0

Điều đáng nói đến là mã này hoạt động hoàn toàn khác trong C++ 11. – Csq

+0

@Csq: vâng, tôi đang đi trước bạn. Đối với các giá trị của "cách" bằng "hầu như". Tôi đã chỉ kiểm tra các tiêu chuẩn trước khi đăng bài rằng bit :-) –

+0

Được rồi .. vì vậy không có cách nào để sửa chữa nó mà không có C++ 11? Cảm ơn :) – user1729422

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