So habe ich ein Vektor wie so:Der beste Weg, um ein std :: unique_ptr aus einem Vektor mit einem rohen Zeiger zu löschen?
std::vector<std::unique_ptr<SomeClass>> myVector;
Dann habe ich einen anderen Vektor, der rohe Zeiger von SomeClass
enthält:
std::vector<SomeClass*> myOtherVector;
Wenn es ein Element innerhalb myOtherVector
ist es auch innerhalb myVector
sein wird, Ich möchte also jedes Element in myOtherVector
durchlaufen und das gleiche Element aus myVector
entfernen. Dann lösche den Vektor. Das ist, was ich kam mit:
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
Dies erzeugt einen Kompilierung-Fehler, weil myVector
eindeutige Zeiger hält, aber ich bin der remove()
Funktion einen Rohzeiger geben. Hier brauche ich Hilfe, weil ich nicht weiß, wie der richtige Weg zur Lösung dieses Problems aussehen könnte. Ich habe die Zeile:
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
Frist all dies falsch ist, denn jetzt habe ich zwei std::unique_ptr
s das gleiche Objekt verweisen. Das Element innerhalb myVector
enthält eine Referenz und die Konstruktion des eindeutigen Zeigers in der obigen Zeile ist eine weitere Referenz. Und ich weiß nicht einmal, ob das Konstruieren eines neuen Zeigers, um denselben Typ zu erhalten, konzeptionell der richtige Weg ist, dies zu tun. Also änderte ich die einzigartigen Zeiger auf gemeinsame Zeiger: „ApplicationName.exe einen Breakpoint ausgelöst hat“
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
Wenn ich die Anwendung lief die myVector.erase()
Linie in einem Laufzeitfehler geführt, die die Beim Klicken auf "Fortfahren" kam es zu einem Debug-Assertion-Fehler.
Also offensichtlich mache ich etwas falsch, aber ich weiß nicht was. Was ist der richtige Weg, um einen intelligenten Zeiger von einem Vektor mit einem rohen Zeiger zu löschen?
Sie die Probleme durch Vereinfachung betrachtet haben nicht nur einen Vektor von rohen Zeiger beibehalten zu beginnen? –
'std :: unique_ptr' hat ein 'get'-Element, das den eigenen Zeiger zurückgibt. –
Uh, ein Vorschlag. Es gibt einen weiteren intelligenten C++ 11-Zeiger namens 'std :: shared_ptr'. –