2012-05-10 36 views
6

Giả sử tôi đã VectorAVectorB hai std::vector<SameType>, cả initilized (i có nghĩa VectorA.size() > 0VectorB.size() > 0)Memory de-phân bổ với std :: vector tái phân

Nếu tôi làm:

VectorA = VectorB; 

sự bộ nhớ được phân bổ cho VectorA được tự động giải phóng?

+2

Có nó được giải thoát. – tuxuday

Trả lời

5

Nó được giải phóng theo nghĩa rằng các destructors của tất cả các đối tượng chứa được gọi, và vector không còn sở hữu bộ nhớ.

Nhưng thực sự, nó chỉ được trả về allocator, có thể hoặc không thực sự trả lại cho hệ điều hành.

Miễn là không có lỗi trong trình cấp phát đang được sử dụng, bạn chưa tạo rò rỉ bộ nhớ, nếu đó là điều bạn quan tâm.


1. Vì @David chỉ ra trong nhận xét bên dưới, bộ nhớ không nhất thiết phải được phân bổ, tùy thuộc vào kích thước cần thay đổi hay không.

+1

Chuyển nhượng không cần phải tái phân bổ, sao chép và xử lý lại bộ đệm cũ nếu vectơ đích có đủ dung lượng. Nó không cần phải phá hủy các đối tượng cũ, nhưng có thể sử dụng toán tử * gán * để * viết lại * các phần tử 'min (v1.size(), v2.size())' đầu tiên (giả sử rằng nó không cần để tái phân bổ. –

2

Nói chung, không nhất thiết phải. Khi bạn gán một véc tơ cho nhau, điều kiện bài viết là cả hai mảng sẽ chứa tương đương đối tượng khi kết thúc thao tác.

Nếu capacity của vector đích là đủ, hoạt động có thể đạt được bằng cách gọi các nhà điều hành phân trên bộ min(v1.size(), v2.size()) yếu tố, và sau đó, hoặc huỷ phần còn lại của các yếu tố nếu vector nơi tổ chức nhiều yếu tố, hoặc người khác sao chép-xây dựng các yếu tố bổ sung ở cuối. Trong trường hợp này không có phát hành bộ nhớ hoặc phân bổ sẽ được thực hiện.

Nếu véc tơ đích không có đủ dung lượng, thì nó sẽ tạo bộ đệm mới có đủ dung lượng và sao chép các phần tử trong bộ đệm mới từ vectơ nguồn. Sau đó nó sẽ trao đổi bộ đệm cũ và mới, phá hủy tất cả các đối tượng cũ và giải phóng bộ đệm cũ. Trong trường hợp này, các đối tượng cũ bị bị phá hủy và bộ nhớ cũ được giải phóng, nhưng đây chỉ là một trường hợp.

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