Tôi đã thực hiện ít chương trình sau: (cơ bản là một lớp mà couts nếu nó được tạo ra, sao chép hoặc bị phá hủy và một chính mà không một số trong đó)std C++ hủy diệt yếu tố container và hành vi chèn
class Foo
{
public:
Foo(string name): _name(name)
{
cout << "Instance " << _name << " of Foo created!" << std::endl;
};
Foo(const Foo& other): _name(other._name)
{
cout << "Instance " << _name << " of Foo copied!" << std::endl;
};
~Foo()
{
cout << "Instance " << _name << " of Foo destroyed!" << std::endl;
}
string _name;
};
int main(int argc, char**argv)
{
Foo albert("Albert");
Foo bert("Bert");
{
vector<Foo> v1, v2;
system("PAUSE");
v1.push_back(albert);
system("PAUSE");
v2.push_back(bert);
system("PAUSE");
v1 = v2;
system("PAUSE");
}
system("PAUSE");
}
Kết quả trông giống như sau:
Instance Albert of class Foo created!
Instance Bert of class Foo created!
Press any key...
Instance Albert of class Foo copied!
Instance Albert of class Foo copied! // why another copy?
Instance Albert of class Foo destroyed! // and destruction?
Press any key...
Instance Bert of class Foo copied!
Instance Bert of class Foo copied!
Instance Bert of class Foo destroyed!
Press any key... // v1=v2 why did the albert instance not get destroyed?
Press any key...
Instance Bert of class A destroyed!
Instance Bert of class A destroyed!
Press any key... // there's still an albert living in the void
Điều này khiến tôi rất kỳ quặc. Tại sao tôi thậm chí bận tâm chuyển một cái gì đó như là một tài liệu tham khảo nếu nó được sao chép hai lần không? Tại sao v1.operator = (khác) không phá hủy các phần tử chứa? Nó sẽ phù hợp với hành vi của shared_ptr. Ai đó có thể cho tôi biết lý do không?
BỔ SUNG tôi đặt điều này trong một vòng lặp vô tận và kiểm tra việc sử dụng mem, nó dường như không để sản xuất rò rỉ mem ít nhất.
ADDITION Ok, mem không phải là vấn đề vì nó sử dụng toán tử = chứ không phải sao chép, ok cảm ơn. Khi tôi thêm
v1.reserve(10);
v2.reserve(10);
số lượng bản sao hợp lý diễn ra. mà không có nó phân bổ lại và sao chép toàn bộ vectơ cho mỗi push_back đơn, (mà tôi thấy khá chậm chạp ngay cả đối với các vectơ nhỏ). Nhìn này, tôi sẽ xem xét sử dụng .reserve hơn và tối ưu hóa toán tử gán của tôi Giống như địa ngục :)
ADDITION: TÓM TẮT
- Tất cả những vấn đề này dường như đặc trưng cho VC++ 2005.
- Nếu kích thước của hai thùng chứa khớp nhau, việc triển khai của tôi sử dụng toán tử = trên các yếu tố thay vì phá hủy các phần tử cũ và sao chép các phần tử mới. NẾU các kích thước khác nhau, phá hủy bình thường và sao chép được sử dụng.
- Với việc thực hiện năm 2005, người ta phải sử dụng dự trữ! Nếu không thì hoạt động tuân thủ tiêu chuẩn và không tương thích.
- Những hộp đen này đen hơn tôi tưởng.
Bạn đã thử biên dịch bản này dưới dạng bản dựng chưa? – jalf
Có. Cùng một kết quả. – AndreasT
Nó rất dễ dàng để thử bản thân, chỉ cần sao chép dán vào một dự án trống rỗng, và thêm bao gồm iostream, vector và chuỗi, và đi. – AndreasT