Ich habe zwei Vektoren von Zeigern:Speicherleck auf vector._Reallocate() in Visual C++ Speicher-Debugger
- Ein Vektor Zeiger auf alle Objekte
- Eine temporäre Vektor enthält Zeiger auf einige der Objekte enthalten in der obige Vektor. In jedem Frame wird dieser Vektor gelöscht und Zeiger werden dann erneut hinzugefügt.
Während dieser Frames werden keine Objekte erstellt oder gelöscht.
Nach Visual Studio Speicher-Profiler bekomme ich ein Speicherleck, in Vector._Reallocate() jedes Mal, wenn ich einen Zeiger auf diesen Vektor hinzufügen.
Image: http://i.stack.imgur.com/f4Ky3.png
Meine Frage ist: Hat vector.push_back() etwas zuweisen, die nicht später freigegeben wird, oder ist Speicher-Profiler Visual Studio nur verwirrt, weil ich ein Vektor-Clearing, ohne die Elemente zu zerstören? Dies geschieht nur im Debug-Modus - nicht in Release.
Ich verstehe, dass die _Reallocate (..) - Methode Speicherplatz auf dem Heap reserviert, aber da ich den Vektor löschen, sollte dies kein Leck verursachen, nehme ich an?
Update: using std :: list statt std: .Vector löst das "Problem" - obwohl ich weiß nicht, ob es wirklich ein Problem ist oder nicht
Update2: es geschieht in Freigabemodus ebenfalls. Ich war ein wenig verwirrt durch die Ausgabe, aber ich bekomme das gleiche Problem dort
** Update3: Ich habe einige Code, der das Problem reproduzieren kann, angeschlossen. Ich könnte das Problem nur reproduzieren, wenn ich die Vektoren in einem mehrdimensionalen Array wie im ursprünglichen Problem speichern würde.
class MyClassContainer
{
public:
std::vector<MyClass*> vec;
};
int main(int args, char **argv)
{
std::vector<MyClass*> orig;
MyClassContainer copy[101][101];
for(int i = 0; i < 101; i++)
orig.push_back(new MyClass());
while (true)
{
int rnd = std::rand() * 100/RAND_MAX; int rnd2 = std::rand() * 100/RAND_MAX;
for (int i = 0; i < 101; i++)
for (int j = 0; j < 101; j++)
copy[i][j].vec.clear(); // this should clear all??
copy[rnd2][rnd].vec.push_back(orig[rnd]);
}
return 0;
}
Update 4:Der Speicher-Debugger zeigt eine zunehmende Anzahl von Heapzuweisungen wie die Zeit vergeht. Allerdings habe ich jetzt bemerkt, dass wenn ich lange warte, die Anzahl der neuen Heap-Zuweisungen pro Sekunde auf 0 abfällt. Also ist es anscheinend nicht wirklich ein Speicherleck. Es scheint, dass, wenn jeder Vektor im Array mindestens einmal gedrückt wurde, nichts mehr auf dem Heap zugewiesen wird. Ich verstehe jedoch nicht warum.
* "Dies passiert nur im Debug-Modus - nicht in Release."* - Debug-Modus könnte auf Speicherlecks prüfen, Release-Modus nicht. –
Aber warum würde vector.push_back (Zeiger auf Objekt) einen Speicherverlust verursachen? Natürlich würde vector.push_back (neues Objekt (...)), aber Ich gebe nicht alles auf dem Haufen. – MyNiceDisplayName
Können Sie ein [mcve] produzieren? – NathanOliver