Khi sử dụng một vectơ vectơ rất lớn, chúng tôi đã tìm thấy một phần của bộ nhớ không được giải phóng.Huge std :: vector <std::vector> không giải phóng tất cả bộ nhớ về sự hủy diệt
#include <iostream>
#include <vector>
#include <unistd.h>
void foo()
{
std::vector<std::vector<unsigned int> > voxelToPixel;
unsigned int numElem = 1<<27;
voxelToPixel.resize(numElem);
for (unsigned int idx=0; idx < numElem; idx++)
voxelToPixel.at(idx).push_back(idx);
}
int main()
{
foo();
std::cout << "End" << std::endl;
sleep(30);
return 0;
}
Điều đó để lại khoảng 4GB bộ nhớ bị treo cho đến khi quá trình kết thúc.
Nếu chúng ta thay đổi dòng for
để
for (unsigned int idx=0; idx < numElem; idx++)
voxelToPixel.at(0).push_back(idx);
bộ nhớ được giải phóng.
Sử dụng gcc-4.8
trên máy linux. Chúng tôi đã sử dụng htop
để theo dõi mức sử dụng bộ nhớ trên máy tính có RAM 100 GB. Bạn sẽ cần khoảng 8 GB RAM để chạy mã. Bạn có thể tạo lại vấn đề? Bất kỳ ý tưởng về lý do tại sao điều đó đang xảy ra?
EDIT: Chúng tôi đã thấy rằng điều đó không xảy ra trong máy Mac (với gcc
hoặc clang
). Ngoài ra, trong linux, bộ nhớ được giải phóng nếu chúng ta gọi foo
hai lần (nhưng lại xảy ra lần thứ ba).
Bạn có thể sao chép điều này bằng ví dụ nhỏ hơn không? – stefan
@stefan nhỏ hơn như thế nào? trong số yếu tố? Tôi đã nhìn thấy điều này xảy ra trên 2^25, nhưng đối với nhỏ hơn nó khó nói. – quimnuss