Nó không gọi khi bạn push_back
, nó được gọi là khi tạm thời bị phá hủy.
Để khắc phục nó trong ví dụ của bạn:
TEST test;
for (int i = 0; i < 5; ++i)
{
m_test.push_back(test);
}
chỉ nên gọi nó là một lần.
Mã của bạn đang tạo tạm thời TEST
trong vòng lặp, sử dụng nó trong push_back
, khi đó tạm thời sẽ hết phạm vi khi vòng lặp kết thúc/lặp lại và bị hủy. Điều đó xảy ra chính xác như mong muốn, vì nhu cầu tạm thời TEST
cần được dọn sạch.
Nếu bạn muốn tránh điều đó, bạn cần phải làm bất cứ điều gì khác ngoài việc tạo một đối tượng tạm thời cho mỗi lần đẩy. Một giải pháp tiềm năng là:
vector<TEST> m_test(5); // Note reserving space in the vector for 5 objects
std::fill(m_test.begin(), m_test.end(), TEST()); // Fill the vector with the default ctor
Tùy thuộc vào cách STL của bạn được tối ưu hóa, điều này có thể không cần phải tạo nhiều bản sao.
Bạn cũng có thể để có được xử lý tốt hơn nếu bạn thực hiện một constructor sao chép trong lớp TEST
của bạn, như:
TEST::TEST(const TEST & other)
{
x = new int(*other.x); // Not entirely safe, but the simplest copy ctor for this example.
}
Cho dù điều này là thích hợp, hoặc làm thế nào bạn xử lý nó, phụ thuộc vào lớp học của bạn và nó nhu cầu, nhưng bạn thường có một hàm tạo bản sao khi bạn đã định nghĩa hàm tạo và hàm hủy thường xuyên của riêng bạn (nếu không trình biên dịch sẽ tạo ra một trình tạo và trong trường hợp này, nó sẽ dẫn đến sao chép và treo con trỏ đến x
).
Trong C++ 11, bạn có thể sử dụng 'm_test.emplace_back()' để tránh tạo tạm thời. Trong mọi trường hợp, hãy luôn nhớ [Quy tắc Ba] (http://stackoverflow.com/questions/4172722). –