2016-06-06 8 views
-1

Ich habe zwei Vektoren von Zeigern:Speicherleck auf vector._Reallocate() in Visual C++ Speicher-Debugger

  1. Ein Vektor Zeiger auf alle Objekte
  2. 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.

+0

* "Dies passiert nur im Debug-Modus - nicht in Release."* - Debug-Modus könnte auf Speicherlecks prüfen, Release-Modus nicht. –

+0

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

+0

Können Sie ein [mcve] produzieren? – NathanOliver

Antwort

0

Nicht um das Offensichtliche hervorzuheben ... aber Sie befreien die hier erstellten MyClass-Objekte nicht. Da Sie einen Vektor von rohen Zeigern haben, müssen diese freigegeben (und nur einmal freigegeben) werden.

orig.push_back(new MyClass()); 

Setzen Sie dies am Ende der wichtigsten und Ihre Lecks sollten weggehen. Vielleicht wurden Sie durch den Ort der Leckmeldung irregeführt? vector :: push_back() sollte nicht lecken.

// Free the objects 
for (int i = 0; i < orig.size(); i++) { 
    delete orig[i]; 
    orig[i] = 0; // not necessary, but good defensive practice 
} 

Ich empfehle auch Smart-Pointer, für genau diese Fälle.

PS: Nicht wirklich mein Geschäft, aber was macht dieser Algorithmus? Das ist eine Menge Vektoren ...

+0

Vielen Dank. Sie haben Recht, ich sollte definitiv die Objekte vor dem Verlassen. Allerdings ist das nicht die "Leck" ich verweise auf. Der Speicher-Debugger zeigt eine zunehmende Anzahl von Heap-Zuordnungen im Laufe der Zeit.Allerdings bemerkte ich jetzt, dass, wenn ich warte für eine lange Zeit nimmt die Anzahl der neuen Heap-Zuweisungen pro Sekunde zu 0 ab. Offensichtlich ist es also 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. – MyNiceDisplayName

+0

Und um deine Frage zu beantworten: Im Originalcode teile ich eine riesige Sammlung von Objekten in eine Struktur, die einem Octree ähnelt (aber ohne rekursive Auflösung). Jede Gitterzelle enthält einen Vektor von Elementen. – MyNiceDisplayName