2010-08-29 38 views
6

Đây là mã (cũng tại http://pastebin.com/yw5z2hnG):C++ Quá nhiều destructors gọi là quá ít đối tượng

#include <iostream> 
#include <vector> 
using namespace std; 

class X 
{ 
    public: 
    int i; 
    X(); 
    ~X(); 
}; 

X::X() 
{ 
    i = 1; 
    cout << "---constructor" << '\n'; 
} 

X::~X() 
{ 
    cout << "***desctructor" << '\n'; 
} 

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    cout << "------------------------------------" << endl; 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    cout << "------------------------------------" << endl; 
    delete vx; 
} 

tôi nhận được đầu ra như:

------------------------------------ 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
------------------------------------ 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 

Tôi không hiểu tại sao rất nhiều destructors là gọi là.

+1

bản sao này nhiều lần ... nhưng tôi không thể tìm thấy chúng khiến mọi người hỏi câu hỏi này thường không biết về các nhà xây dựng bản sao được xác định ngầm: p Tôi luôn thấy buồn cười rằng sự thiếu hiểu biết có thể ngăn cản người khác học vì nó ngăn cản người ta truy vấn một cách hiệu quả. –

Trả lời

14

Nếu bạn định nghĩa constructor sao chép riêng của bạn, bạn sẽ thấy các đối tượng khác được xây dựng:

class X 
{ 
    public: 
    int i; 
    X(const X&); 
    X(); 
    ~X(); 
}; 

X::X(const X& x) : i(x.i) 
{ 
    cout << "---copy constructor\n"; 
} 

// ... rest as before 

Trình biên dịch sẽ cung cấp một constructor sao chép mà không thực hiện đăng nhập nếu bạn không khai báo một của riêng bạn.

+0

+1: Các bản sao ngầm định là nguyên nhân. – Puppy

1

Thêm một chi tiết - nếu bạn dành không gian cho vector của bạn trước:

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    vx->reserve(5); 
    .... 

Sau đó, bạn sẽ nhận được kết quả như sau:

---constructor 
+++ copy constructor 
***desctructor 
---constructor 
+++ copy constructor 
***desctructor 
... 

Như bạn có thể nhìn thấy vector cũng có bản sao tất cả các yếu tố của nó khi cần tái phân bổ lưu trữ - đó là lý do tại sao bạn nhận được 5 bản sao và trình phá hủy cho push_back()

+0

Câu trả lời của bạn đã giúp ích rất nhiều. Tôi dự trữ không gian bây giờ bất cứ nơi nào có thể, không chỉ vectơ. Chương trình của tôi chạy nhanh hơn rất nhiều. Cảm ơn! – Xolve

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