2012-12-03 87 views
11

thể trùng lặp:
How to release std::vector if there is no heap memoryLàm thế nào để tiêu diệt đúng C++ vector của vector và giải phóng bộ nhớ

C++ Noob đây

Giả sử tôi tuyên bố một vector của vector như:

vector<vector<vector<double> > > phi_x; 

Sau khi tôi sử dụng xong, làm thế nào để phá hủy nó để giải phóng bộ nhớ?

Tôi đã đọc một số trang web khác và họ khuyên bạn nên sử dụng .clear(). Từ sự hiểu biết của tôi, điều này chỉ xóa các phần tử nhưng công suất vectơ không được giải phóng. Tôi muốn vector bị lãng quên hoàn toàn như nó chưa bao giờ tồn tại.

Ngoài ra, ứng dụng hiện tại của tôi về vectơ có kích thước 54x54x9 và tôi có khoảng 12 trong số những thứ này. Điều đó được coi là ngớ ngẩn lớn?

+0

nhưng đây là một vec tơ vectơ của vec-tơ, đó là một câu hỏi rất khác nhau – thecoshman

Trả lời

7

Bạn không phải làm gì cả. Chỉ cần để biến biến ra khỏi phạm vi.

+0

Tôi thấy nhưng phân bổ bộ nhớ cho vectơ có làm chậm hoạt động của phần còn lại của mã sau đó không. –

+0

@KeenanZ Không có khả năng. Lập hồ sơ cho mã của bạn để xem. Dù bằng cách nào, bạn chỉ có thể thêm một phạm vi khối lồng nhau xung quanh mỗi lần sử dụng vectơ. –

0

Nếu biến số phi_x của bạn là một số biến cục bộ bên trong một số khối, nó sẽ bị phá hủy do có hàm hủy của nó được gọi là ở cuối khối.

Nếu đó là biến toàn cục, nó sẽ bị hủy sau khi main kết thúc.

2

Sau khi sử dụng xong, tôi làm cách nào để hủy nó để giải phóng bộ nhớ?

Hãy để nó nằm ngoài phạm vi.

ứng dụng hiện tại của vector của tôi có kích thước 54x54x9 và tôi có khoảng 12 trong số những thứ này. Điều đó được coi là ngớ ngẩn lớn?

Tùy theo. Nếu nó là cho một nền tảng nhúng với bộ nhớ 64k, sau đó có, nó là lớn. Nếu nó là dành cho máy tính để bàn tiêu chuẩn, với 4G + RAM, sau đó nó có thể được bỏ qua.

7

Nếu bạn gọi .clear(), các vectơ bên trong sẽ hoàn toàn bị hủy. Tuy nhiên, vector ngoài cùng có thể giữ lại bộ nhớ mà nó sử dụng cho các mảng vectơ của nó (phi_x.size() * sizeof(vector<vector<double> >) bytes). Để xóa hoàn toàn bộ nhớ và giải phóng tất cả bộ nhớ, hoán đổi với một véc tơ trống:

phi_x.swap(vector<vector<vector<double> > >()); 

Hoặc chỉ đơn giản là để phi_x hết phạm vi.

+0

Xóa hoàn toàn giúp –

0

Nếu véc tơ này như được minh họa trong ví dụ của bạn, không cần phải thực hiện thêm bất kỳ việc dọn dẹp nào, bộ nhớ sẽ được giải phóng hoàn toàn bởi bộ hủy ngay khi nó nằm ngoài phạm vi.

Điều này sẽ xảy ra ngay khi hàm được khai báo trong lần thoát hoặc nếu đối tượng mà nó đang sống bị hủy.

0

Trình phá hủy sẽ thực hiện công việc dọn dẹp cho bạn. Bạn không phải làm bất cứ điều gì, nhưng hãy để phi_x đi ra khỏi phạm vi.

{ 
    vector<vector<vector<double> > > phi_x; 

    // do stuff with phi_x 
} 
// phi_x is gone here 
1

Bạn không phải làm bất cứ điều gì, trình hủy sẽ làm sạch chính xác.

Nếu bạn muốn giải phóng dung lượng bộ nhớ trước khi hết phạm vi, bạn có thể làm rõ mức trên cùng. Điều này sẽ không tái phân bổ bộ nhớ được sử dụng bởi các vector đầu nhưng nó sẽ loại bỏ tất cả các vector chứa và chúng sẽ giải phóng bộ nhớ của chúng trong các destructors của chúng.

Đó là khoảng 1 triệu yếu tố loại gấp đôi nếu tôi tính toán đúng. Giả sử một máy tính hiện đại như một nền tảng không phải là ngu ngốc lớn. Hoặc thậm chí rất lớn :)

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