2011-10-28 34 views
5

Tôi có một biến thành viên lớp như thế này:Làm thế nào để phát hành std :: vector nếu không có bộ nhớ heap

vector<vector<int> > m_stacks; 

Khi tôi cư nó, tôi làm như thế này:

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
m_stacks.push_back(v); 
vector<int> v2; 
v2.push_back(1); 
v2.push_back(2); 
m_stacks.push_back(v2); 

Bây giờ Tôi tự hỏi những gì tôi nên làm trong destructor lớp để phát hành m_stacks. Tôi không phân bổ bộ nhớ heap cho nó, vì vậy tôi đang đấu tranh nếu tôi thực sự cần phải làm bất cứ điều gì. Cuối cùng tôi đưa ra điều này -

vector<vector<int> >::iterator itr = m_stacks.begin(); 
for (; itr != m_stacks.end(); ++itr) { 
    itr->clear(); 
} 

Tôi nghĩ rằng đây là điều tôi cần làm nhất, tôi không cần gọi số m_stacks.clear(). Lý do là destructor của vector có thể tự động giải phóng bộ nhớ. Nhưng tôi vẫn cần mã trên mặc dù, lý do là destructor của vector không gọi destructor của phần tử của nó.

Bạn có thể xác nhận cuộc gọi của mình không?

Trả lời

14

Bạn không phải làm bất cứ điều gì cho m_stacks (một thành viên dữ liệu class). Bộ nhớ có được sẽ được tự động phát hành khi các destructor class sẽ được gọi. Đây là mục đích mà sử dụng std::vector.

6

Các destructor std::vector gọi một xóa trên bộ nhớ nó phân bổ, do đó gọi các loại (trong trường hợp này, một std::vector<int> 's) destructor.

Các cấu trúc dữ liệu này đều dựa trên nguyên tắc SBRM (Quản lý tài nguyên ràng buộc phạm vi), hoặc RAII (Thu nhập tài nguyên là khởi tạo), trong đó tất cả bộ nhớ mà chúng phân bổ sẽ bị phân bổ khi chúng nằm ngoài phạm vi (chẳng hạn như phạm vi một lớp học).

Bạn không cần phải lo lắng về việc giải phóng bộ nhớ từ std::vector trừ khi nó có một loại chỉ vào bộ nhớ; nhưng không phát hành nó vốn có (chẳng hạn như một con trỏ!).

8

destructor cho một vector sẽ làm hai việc: nó sẽ phá hủy từng phần tử của vectơ, sau đó nó sẽ giải phóng bộ nhớ được sử dụng cho chính vectơ. Điều này là tự động.

Trong trường hợp của bạn, bạn có vectơ lồng nhau hai chiều sâu, nhưng không quan trọng. Khi vectơ mức cao nhất bị phá hủy, nó sẽ gọi destructor cho mỗi vec-tơ nó chứa, và tất cả các vectơ đó sẽ tự làm sạch chúng một cách chính xác.

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