Ich bin derzeit Refactoring und ändern Sie den vorhandenen Code in C++ 11 und ich frage mich, ob Speicherleck haben. Mein Code hat eine Struktur mit einer std::vector
darin sowie eine Methode zu shrink()
diesen Vektor bis auf seine negativen Elemente.Löschen Mitglied der Struktur auf Heap nach Std :: move()
struct mystruct_t {
int other_stuff;
std::vector <int> loc;
// Adds elements to loc vector
void add(int pos){
loc.push_back(pos);
}
// Shrink the list
void shrink() {
std::vector<int> tmp;
for (unsigned int i = 0; i < loc.size(); ++i) {
if (loc[i] < 0) tmp.push_back (loc[i]);
}
loc = tmp;
std::vector<int>(loc).swap (loc);
}
mystruct_t(): otherstuff(0) {};
};
In einer anderen Funktion erstelle ich eine neue Instanz dieser Struktur wie folgt aus:
mystruct_t c = new mystruct_t;
c->add(2);
c->add(3);
...
Und später rufe ich die shrink()
Methode dieser Struktur.
c->shrink()
Jetzt bin ich nicht sicher, was mit dem „alten“ loc Vektor nach der Schrumpffunktion passiert? Wird es automatisch zerstört oder muss ich von Hand zerstört werden? Und wenn das später wäre, wie würde ich das tun?
Ich habe auch versucht, um es durch eine Änderung shrink()
mehr C++ 11-Stil zu ändern:
void shrink(){
std::vector<int> tmp;
for (auto &currLoc : loc) {
if (currLoc < 0) tmp.push_back (currLoc);
}
loc = std::move(tmp);
}
Aber die Frage bleibt gleich, was mit dem „alten“ loc Vektor geschieht zusätzlich zu erhöhen dies scheint die Speicherbelegung. Ich bin neu in C++ 11 und nicht sicher, ob ich das Konzept völlig falsch verstehe?
'std :: vektor (loc) .swap (loc);' was ist der Sinn dieser? –
Holt
@Holt Es ist ein garantiertes 'shrink_to_fit', da' shrink_to_fit' nicht benötigt wird, um irgendetwas zu tun. – NathanOliver
@NathanOliver Würde 'loc.swap (tmp)' nicht einfacher sein? – juanchopanza