Có hai điều riêng biệt ở đây:
- đối tượng đời
- thời gian lưu trữ
Ví dụ:
{
vector<MyObject> v;
// do some stuff, push some objects onto v
v.clear(); // 1
// maybe do some more stuff
} // 2
Tại 1
, bạn rõ ràng v
: này phá hủy tất cả các đối tượng mà nó đang lưu trữ. Mỗi người được gọi là destructor của nó, nếu bạn đã viết một, và bất cứ điều gì thuộc sở hữu của rằng MyObject
bây giờ được phát hành. Tuy nhiên, vector v
có quyền giữ bộ nhớ thô trong trường hợp bạn muốn sau này.
Nếu bạn quyết định đẩy một số thứ khác vào giữa 1
và 2
, điều này tiết kiệm thời gian vì nó có thể sử dụng lại bộ nhớ cũ.
Tại 2
, vector v
đi ra khỏi phạm vi: bất kỳ đối tượng bạn đẩy vào nó từ 1
sẽ bị phá hủy (như nếu bạn muốn một cách rõ ràng được gọi là rõ ràng một lần nữa), nhưng bây giờ việc lưu trữ cơ bản cũng được phát hành (v
won' t xung quanh để tái sử dụng nó nữa).
Nếu tôi thay đổi ví dụ cái v
trở thành một con trỏ, bạn cần phải xóa nó một cách rõ ràng, như con trỏ đi ra khỏi phạm vi ở 2
không làm điều đó cho bạn. Tốt nhất bạn nên sử dụng một cái gì đó như std::unique_ptr
trong trường hợp đó, nhưng nếu bạn không và v
bị rò rỉ, dung lượng lưu trữ được phân bổ cũng sẽ bị rò rỉ. Như trên, bạn cần đảm bảo rằng v
bị xóa và gọi số clear
là không đủ.
Không có gì khác biệt so với trường hợp thứ hai so với trường hợp đầu tiên ngoài thực tế nó chỉ một vectơ. Tôi nghĩ rằng câu hỏi này nên được mở rộng để bạn có được một nắm bắt về cách phân bổ bộ nhớ/deallocation nên làm việc, và có lẽ con trỏ quá. – Marlon
Điều này nói rằng tuyên bố nó bên trong một chồng chức năng tự động gọi destructor lúc đóng cửa. https://stackoverflow.com/questions/3054567/right-way-to-deallocate-an-stdvector-object –