Frage

Was genau ist ein „assert“, oder genauer gesagt, wie kann ich von einem Fehler loszuwerden. Wenn ich einen Vektor von Zeigern auf eine Klasse mit Datenelement int x erstellen und diese dann tun:

for(I=antiviral_data.begin();I<antiviral_data.end();I++)
{
    if((*I)->x>maxx)
    {
        antiviral_data.erase(I);
    }
}

Und das Programm auszuführen, habe ich keine Fehlermeldungen erhalten, bis x größer als maxx ist und ich verwende .Löschen (), an welcher Stelle ich bekomme diese Fehlermeldung:

  

Debug Assertion Failed!

     

Programm: ... My Documents \ O.exe Datei:   ... include \ Vektor Line: 116

     

Expression:   ( "This -> _ Has_container ()", 0)

     

Weitere Informationen, wie Sie Ihr Programm   kann einen Assertionsfehler verursachen, siehe   die Visual C ++ Dokumentation   behauptet.

     

(Drücken Sie Wiederholen, um die Anwendung zu debuggen)

     

[Abbruch] [Wiederholen] [Ignorieren]

Auch wenn ich versuche zu verwenden cout:

cout<<(*antiviral_data.begin())->x<<endl;

Ich bekomme diese Fehlermeldung:

  

Debug Assertion Failed!

     

Programm: ... My Documents \ O.exe Datei:   ... include \ Vektor Line: 98

     

Expression: Vektor-Iterator nicht   deferencable

     

Weitere Informationen, wie Sie Ihr Programm   kann einen Assertionsfehler verursachen, siehe   die Visual C ++ Dokumentation   behauptet.

     

(Drücken Sie Wiederholen, um die Anwendung zu debuggen)

     

[Abbruch] [Wiederholen] [Ignorieren]

Könnte jemand bitte sagen Sie mir, warum ich nicht irgendwelche Daten in den Vektor verwenden können, und wie man es beheben?

AUCH: antiviral_data ist ein Vektor von Zeigern, mit einem einzigen Elemente:

antiviral_data.push_back(new aX1(player.x,player.y,'>'));

Wenn das hilft.

War es hilfreich?

Lösung

Der wahrscheinlichste Grund, warum Sie die Behauptung bekommen, ist, dass Sie mich nach einem Lösch erhöhen. Versuchen Sie stattdessen:

for(I=antiviral_data.begin();I!=antiviral_data.end();)
{
    if((*I)->x>maxx) I=antiviral_data.erase(I); else ++I;
}

Siehe auch http://www.cppreference.com/wiki/stl/vector/ löschen , suchen Sie nach ungültig Iteratoren auf dieser Seite.

Andere Tipps

Eine Assertion ist in der Regel ein Ausdruck von einem Entwickler für Debug- und Fehlerkontrollzwecke eingegeben -. Sie setzen verschiedenes „Gesundheits-Checks“ im Code zur Verfügung und das Programm zum Absturz bringen, wenn die Prüfung nicht erreicht

Zum Beispiel vorstellen, dass Sie Code hatte die zwei Zahlen irgendwo auf der Straße teilen würde. Auch wenn Sie immer eine Division durch Nicht-Null erwarten, setzen Sie bei assert vor der Teilung in dem Fall ein Argument falsch berechnet wurde. Wenn die Assertion fehlschlägt, bedeutet dies irgendwo auf der Straße ein Fehler war.

Assertions erscheinen normalerweise nur in der Debug-Version im Code (Wenn Sie Visual C ++ verwenden Sie für Debug und Release kompilieren können). Während im Release-Modus Zusammenstellung der Ergebnisse beseitigen würde, ist es eine sehr schlechte Idee, da man immer noch einen Fehler und wahrscheinlich wirklich schlechte Ergebnisse haben würde.

Irgendwo in der Implementierung von Vector (ist es Standard) und speciifcally in Zeile 98, gibt es eine Assertion. Wenn Sie den Zugriff auf den Vektor-Code haben, um zu sehen, was die Assertion ist oder Debug bis zu diesem Punkt. Dies könnte einen Fehler in der Vektor-Implementierung oder im Code angeben, dass Anrufe Vektor.

Das Zeug Sie auf dem Laufenden gibt uns einige Hinweise, was los ist, aber es wäre hilfreich, wenn Sie mehr von dem Programm einfügen könnte, auch dann, wenn die Vektoren definiert.

Das Problem ist mit Lösch Anruf. Sie sind Iterieren durch einen Behälter und zugleich Elemente daraus zu löschen. Nachdem ein Lösch tun, wird Ihr Iterator ungültig. Wenn Sie Elemente eines bestimmten Wertes von einem Vektor Verwendung entfernen möchten löschen mit remove_if Algorithmus. Dies wird als ein Lösch entfernen Idiom bekannt und erklärt sehr gut in Scott Meyers Effective STL Buch. Sie können auf diese Frage siehe auch Elemente von einem Vektor um weitere Informationen zu löschen.

Sie haben schon ein paar gute Antworten zu wissen, was eine Behauptung ist und warum es in Ihrem Code ausgelöst wird. Nun möchten Sie vielleicht für einen zwei Pass Lösch mit STL-Algorithmen betrachten.

namespace {
   struct exceeds : public std::unary_function< TheUnknownType*, bool >
   {
      exceeds_max( int max ) : maxx( max ) {}
      bool operator()( TheUnknownType* data ) {
         return data->x < max;
      } 
   private:
      int maxx;
   };
}
void your_function()
{
   std::vector< TheUnknownType* >::iterator new_end;
   new_end = std::remove_if( antiviral_data.begin(), antiviral_data.end(), exceeds(maxx) );
   antiviral_data.remove( new_end, antiviral_data.end() );
}

Der Hauptvorteil ist, dass Elemente in einem Vektor ist eine teuere Operation zu löschen. Für jedes Element gelöscht wird, alle Elemente von dieser Position bis zum Ende des Vektors muss um eine Position gegenüber dem Anfang bewegt werden. Das zweite Element, das Sie von dort auf einen zweiten Zug aller Elemente zwingen gelöscht werden ... Die STL remove_if Algorithmus die Züge nur einmal in ihre endgültige Position führt eine Iterator Rückkehr eine Vergangenheit das letzte Element Element nicht entfernt. Dann können Sie einen einzigen std :: vector ausführen <> :: entfernen, die nicht Elemente verlagern müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top