Wenn Sie einen sehr großen Vektor von Vektoren verwenden, haben wir gefunden, dass ein Teil des Speichers nicht freigegeben wird.Enormes std :: vector <std::vector> gibt nicht alle Speicher auf Zerstörung frei
#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;
}
Das lässt etwa 4 GB Speicher hängen, bis der Prozess endet.
Wenn wir die for
Linie
for (unsigned int idx=0; idx < numElem; idx++)
voxelToPixel.at(0).push_back(idx);
der Speicher freigegeben wird, ändern.
Verwendung gcc-4.8
auf einem Linux-Computer. Wir haben htop
verwendet, um die Speichernutzung auf einem Computer mit 100 GB RAM zu verfolgen. Sie benötigen ca. 8 GB RAM, um den Code auszuführen. Können Sie das Problem reproduzieren? Irgendwelche Ideen, warum das passiert?
EDIT: Wir haben gesehen, dass das nicht in einem Mac (mit entweder gcc
oder clang
) passiert. Auch unter Linux wird der Speicher freigegeben, wenn wir zweimal foo
aufrufen (geschieht aber das dritte Mal).
Können Sie dies mit einem kleineren Beispiel reproduzieren? – stefan
@stefan kleiner wie? in der Anzahl der Elemente? Ich habe gesehen, dass dies bei 2^25 passiert, aber für kleinere ist es schwer zu sagen. – quimnuss