Tôi có một struct
trông như thế này:bộ nhớ miễn phí được sử dụng bởi một std :: string
struct queue_item_t {
int id;
int size;
std::string content;
};
Tôi có một std::vector<queue_item_t>
đó là dân cư với nhiều trong số này từ một truy vấn cơ sở dữ liệu.
Khi mỗi mục được xử lý, một tệp được đọc từ đĩa và nội dung của nó được đưa vào thành viên chuỗi content
. Mục được xử lý (content
được phân tích cú pháp) và tôi thực thi .clear()
trên chuỗi để không ăn hết bộ nhớ của mình.
Tuy nhiên, điều này dường như không giải phóng bộ nhớ. Tôi có hàng trăm ngàn mặt hàng đang được xử lý và cuối cùng, việc sử dụng bộ nhớ sẽ vượt ra ngoài những gì có sẵn và ứng dụng bị giết bởi Linux với "Out-Of-Memory" là lý do.
Làm cách nào để giải phóng bộ nhớ được sử dụng bởi các chuỗi này?
bạn có cần 'nội dung' làm thành viên của cấu trúc không? Từ lời giải thích của bạn, có vẻ như nó chỉ được sử dụng rất ngắn gọn, nên tạm thời có thể phù hợp hơn với nhiệm vụ. Ngoài ra, tại sao không sử dụng 'std :: queue' thay vì' std :: vector'? –
Thực tế là cấu trúc của bạn được gọi là 'queue_item_t' cho thấy rằng vector của chúng đại diện cho một số loại hàng đợi. Nếu đúng như vậy, tại sao bạn không xóa các phần tử khỏi hàng đợi khi chúng được xử lý?Tôi hỏi bởi vì nó có thể là sửa chữa thích hợp cho vấn đề của bạn nằm ở nơi khác. Phá hủy chúng (và chuỗi nội dung 'của chúng) là một cách khá chắc chắn để giải phóng tài nguyên của chúng! Sau đó, bạn chỉ cần phải đối phó với thực tế rằng việc loại bỏ từ đầu của một véc tơ không hiệu quả - vì vậy hãy sử dụng 'deque' thay vào đó, hoặc nếu thứ tự chúng được xử lý không quan trọng thì xử lý theo thứ tự ngược lại. –
@SanderDeDycker phần tôi đang làm bây giờ chỉ là phần thứ hai của toàn bộ quá trình; trong hoạt động bình thường, dữ liệu không bao giờ được đọc từ các tệp nhưng được truy xuất từ Internet và dữ liệu được đặt trực tiếp trong chuỗi 'nội dung' của từng mục đã được tải xuống. Nhưng bạn đúng, trong hoàn cảnh khác, một biến tạm thời sẽ tốt hơn. –