CodeGuard



  • Hi

    ich bin gerade meine Anwendung von CodeGuard überprüfen lassen,

    und teilweise bringt er einen von mir nicht nachvollziehbaren Fehler:

    Definition eines std::vectors:

    std::vector<AnsiString> m_WriteBuffer;
    

    Benutzen des std::vectors:

    if(m_WriteBuffer.size()>0 && m_aktStatus==KOMMUNIKATION_NOTHING)
    

    Genau an dieser Stelle meckert er folgendes:

    Ungültige Zeigerarithmetik.
    Bei genauerem hinsehen, zeigt er das das size die Differenz zwischen begin() und end() ausrechnet, und in der Zeile bleibt er stehen.

    Passiert jedoch nur manchmal, und nicht reproduzierbar.

    Jemand eine Idee was da falsch sein könnte?

    Mfg

    Reinhold Fischer



  • Dies könnte evtl. ein Fehler bei CodeGuard sein, da end() ja einen Zeiger auf ein Element hinter den gültigen Daten (des Vektors) liefert.
    Ansonsten dürfte es keinen Fehler dort geben.

    Jedoch habe ich einen Tipp für dich. Du solltest evtl. nicht VCL und STL-Klassen mischen, also besser std::vectorstd::string verwenden.



  • Th schrieb:

    Dies könnte evtl. ein Fehler bei CodeGuard sein, da end() ja einen Zeiger auf ein Element hinter den gültigen Daten (des Vektors) liefert.

    Vermute ich auch. Bei mir hatte CodeGuard auch mal so einen Fehler gemeldet, weil ich in einer for-Schleife mit einem Zeiger über ein Array iterierte, in der der Zeiger zunächst über die Arraygrenzen hinaus inkrementiert wurde, die Abbruchbedingung aber vor seiner Verwendung stand. Mit solchen Dingen hat CodeGuard seine Schwierigkeiten.

    Th schrieb:

    Jedoch habe ich einen Tipp für dich. Du solltest evtl. nicht VCL und STL-Klassen mischen, also besser std::vectorstd::string verwenden.

    AnsiString ist keine VCL-Klasse!



  • Ich verstehe hier auch nicht, warum man VCL und STL nicht mischen soll.
    Hinweis:
    statt

    m_WriteBuffer.size()>0
    

    kann man auch

    !m_WriteBuffer.empty()
    

    nehmen.



  • Hallo

    audacia schrieb:

    AnsiString ist keine VCL-Klasse!

    Was denn sonst? 😕

    bis bald
    akari



  • Braunstein schrieb:

    Ich verstehe hier auch nicht, warum man VCL und STL nicht mischen soll.

    Generell hat er schon recht. VCL-Klassen erfüllen diverse Anforderungen, die die STL-Container stellen, nicht, z.B. lassen sie sich nicht einfach so umherkopieren, was std::vector aber, wenn der Speicherbereich neu allokiert werden muß, tut. Auch dürfen sie nur auf dem Heap erstellt werden, was z.B. in boost::array problematisch ist. Zeiger auf VCL-Klassen kann man hingegen bedenkenlos in STL-Containern verwenden.

    @akari: AnsiString ist keine VCL-Klasse (also eine von TObject abgeleitete Klasse), sondern einfach die C++-Implementation des Delphi-sprachinternen Datentyps AnsiString. Und da es alle für Container notwendigen Voraussetzungen mitbringt, kann man es bedenkenlos in STL-Containern verwenden.



  • Hallo

    @akari: AnsiString ist keine VCL-Klasse (also eine von TObject abgeleitete Klasse), sondern einfach die C++-Implementation des Delphi-sprachinternen Datentyps AnsiString. Und da es alle für Container notwendigen Voraussetzungen mitbringt, kann man es bedenkenlos in STL-Containern verwenden.

    Achso... wußte nicht das du VCL so eng siehst. Für mich ist alles VCL was Borland in sein Framework zusätzlich zum C++ Standard gepackt hat, unabhängig davon ob es von TObject abgeleitet ist.

    bis bald
    akari



  • @audacia
    Alle Objekte, die man in einen STL-Container packen will müssen bestimmte Voraussetungen erfüllen. So gesehen haben die VCL-Klassen da kein Alleinstellungsmerkmal. Da man von TObject abgeleitete Klassen eh nur als pointer rumreicht, ist es sogar besonders einfach sie so zu verwenden. AnsiString selber ist ja auch kein Problem. So gesehen sehe ich hier das problem nicht.



  • akari schrieb:

    Achso... wußte nicht das du VCL so eng siehst.

    Eng? Ich sehe das als VCL an, was in Delphi als solche bezeichnet wird. In Delphi kannst du String auch benutzen, ohne die VCL einzubinden, da es nativer Teil der Sprache ist. Die VCL greift nur massiv darauf zurück, weshalb ein Pendant für den C++Builder benötigt wurde.

    @Braunstein: bitte mal lesen, was ich geschrieben habe 😉

    Braunstein schrieb:

    Alle Objekte, die man in einen STL-Container packen will müssen bestimmte Voraussetungen erfüllen.
    ...
    Da man von TObject abgeleitete Klassen eh nur als pointer rumreicht, ist es sogar besonders einfach sie so zu verwenden.

    audacia schrieb:

    VCL-Klassen erfüllen diverse Anforderungen, die die STL-Container stellen, nicht...
    ...
    Zeiger auf VCL-Klassen kann man hingegen bedenkenlos in STL-Containern verwenden.

    Braunstein schrieb:

    AnsiString selber ist ja auch kein Problem.

    audacia schrieb:

    Und da es [AnsiString] alle für Container notwendigen Voraussetzungen mitbringt, kann man es bedenkenlos in STL-Containern verwenden.

    Braunstein schrieb:

    So gesehen sehe ich hier das problem nicht.

    Ich auch nicht. Wirklich.



  • Ok. Ich denke wir sind uns eigentlich einig. 🙂
    Ich hatte diesen Satz

    VCL-Klassen erfüllen diverse Anforderungen, die die STL-Container stellen, nicht...

    so interpretiert, dass du bei Anwendung von VCL-Klassen in Containern Probleme siehst. War wohl eine Mißinterpretation.

    Schönen Tag noch.



  • Was so ein kleiner Satz doch alles für eine Diskussion hervorrufen kann...


Log in to reply