Basierend auf dem, was in C ++ 11 als idiomatisch angesehen wird:
- Sollte ein Iterator in einem benutzerdefinierten Container den zerstörten Container selbst überleben?
- sollte es möglich sein zu erkennen, wann ein Iterator ungültig wird?
- Sind die oben genannten Bedingungen in der Praxis von "Debug-Builds" abhängig?
Details : Ich habe kürzlich mein C ++ aufgefrischt und mich in C ++ 11 zurechtgefunden. Als Teil davon habe ich einen idiomatischen Wrapper um die Uriparser-Bibliothek geschrieben . Ein Teil davon ist das Umschließen der verknüpften Listendarstellung von analysierten Pfadkomponenten. Ich suche Rat, was für Container idiomatisch ist.
Eine Sache, die mich beunruhigt, da ich zuletzt aus durch Müll gesammelten Sprachen stamme, ist sicherzustellen, dass zufällige Objekte nicht nur bei Benutzern verschwinden, wenn sie einen Fehler in Bezug auf die Lebensdauer machen. Um dies zu berücksichtigen, PathList
behalten sowohl der Container als auch seine Iteratoren ein shared_ptr
Objekt für den tatsächlichen internen Status bei. Dies stellt sicher, dass, solange etwas vorhanden ist, das auf diese Daten hinweist, auch die Daten vorhanden sind.
Wenn man sich jedoch die STL (und viele Suchanfragen) ansieht , sieht es nicht so aus, als würden C ++ - Container dies garantieren. Ich habe den schrecklichen Verdacht, dass die Erwartung besteht, Container einfach zerstören zu lassen und damit alle Iteratoren ungültig zu machen. std::vector
scheint sicherlich zuzulassen, dass Iteratoren ungültig werden und trotzdem (falsch) funktionieren.
Was ich wissen möchte ist: Was wird von "gutem" / idiomatischem C ++ 11-Code erwartet? Angesichts der glänzenden neuen intelligenten Zeiger erscheint es seltsam, dass Sie mit STL Ihre Beine leicht abblasen können, indem Sie versehentlich einen Iterator auslaufen lassen. Ist die Verwendung shared_ptr
der Sicherungsdaten eine unnötige Ineffizienz, eine gute Idee zum Debuggen oder etwas, das von STL einfach nicht erwartet wird?
(Ich hoffe, dass durch die Erdung auf "idiomatisches C ++ 11" Anklagen wegen Subjektivität vermieden werden ...)