2012-12-19 8 views
32

Giả sử tôi có một std :: vectơ của cấu trúc. Điều gì sẽ xảy ra với bộ nhớ nếu véc tơ là rõ ràng() 'd?Là std :: bộ nhớ vector được giải phóng khi rõ ràng?

std::vector<myStruct> vecs; 
vecs.resize(10000); 
vecs.clear(); 

Bộ nhớ có được giải phóng hoặc vẫn được gắn với biến vecs làm bộ đệm có thể sử dụng lại không?

+1

Thử gọi 'capacity()'. –

+0

Cảm ơn mọi người. Tôi muốn bộ nhớ được giải thoát - được bảo đảm. Vì vậy, tôi phân bổ véc tơ bằng cách sử dụng std mới: vector , sau đó gọi xóa khi tôi hoàn tất. Do đó bộ nhớ được đảm bảo sẽ được giải phóng. –

+3

@AndrewS .: tác động duy nhất của phân bổ động là giới thiệu một sự thiếu hiệu quả. xem câu trả lời của jerry cho một cách hợp lý để trống một vector. trong cơ thể vòng lặp, một cách tốt khác là chỉ cần tạo vectơ cục bộ cho thân vòng lặp, tức là khai báo nó bên trong thân vòng lặp. –

Trả lời

42

Bộ nhớ vẫn được gắn với vectơ. Nếu bạn muốn giải phóng nó, thông thường là trao đổi với một véc tơ trống. C++ 11 cũng bổ sung thêm một hàm thành viên shrink_to_fit nhằm cung cấp khả năng tương tự trực tiếp hơn, nhưng nó không ràng buộc (nói cách khác, nó có khả năng giải phóng bộ nhớ thừa, nhưng vẫn không thực sự yêu cầu).

6

Trình phá hủy được gọi trên các đối tượng, nhưng bộ nhớ vẫn được cấp phát.

19

Bộ nhớ của véc tơ không được đảm bảo sẽ bị xóa. Bạn không thể truy cập một cách an toàn các yếu tố sau khi rõ ràng. Để đảm bảo bộ nhớ được deallocated Scott Meyers khuyên để làm điều này:

vector<myStruct>().swap(vecs); 

Cplusplus.com đã nói như sau về vấn đề này:

Loại bỏ tất cả các yếu tố từ các vector, gọi tương ứng destructors của họ, để lại bình chứa có kích thước bằng 0.

Dung lượng vector không thay đổi và không có sự tái phân bổ xảy ra do để gọi chức năng này. Một phương án thay thế điển hình buộc việc phân bổ lại là sử dụng hoán đổi: ...

4

Không, bộ nhớ không được giải phóng.

Trong C++ 11, bạn có thể sử dụng phương thức shrink_to_fit để buộc véc tơ vào bộ nhớ trống.

http://www.cplusplus.com/reference/vector/vector/

+3

Bạn có thể sử dụng nó, nhưng tiêu chuẩn xác định rằng nó * không * buộc thêm bộ nhớ sẽ được giải phóng (§23.3.6.3/6): "shrink_to_fit là một yêu cầu không ràng buộc để giảm dung lượng() thành size()." –

+1

... và do đó, nó là tốt như 'thay đổi kích thước (0)' mà * có thể * có tác dụng phụ của việc giải phóng bộ nhớ –

+0

Không, 'thay đổi kích thước (0)' là [đảm bảo để giữ bộ nhớ] (http: //en.cppreference.com/w/cpp/container/vector/resize). –