Wie man std :: vector Operator [] kompilieren Grenzen tun Überprüfung in DEBUG aber nicht in RELEASE machen

StackOverflow https://stackoverflow.com/questions/1290396

Frage

Ich bin mit Visual Studio 2008.

Ich bin mir bewusst, dass std :: vector die Überprüfung der Grenzen mit der in () Funktion hat und Verhalten nicht definiert, wenn Sie versuchen, etwas für den Zugriff auf den Operator [] falsch (außer Reichweite).

Ich bin gespannt, ob es möglich ist, mein Programm mit der Überprüfung der Grenzen zu kompilieren. Auf diese Weise der Operator [] würde die in () Funktion verwenden und ein std :: out_of_range werfen, wenn etwas außerhalb der Grenzen ist.

Der Release-Modus wäre ohne Grenzen kompiliert wird für Bediener-Prüfung [], so dass die Leistung nicht abbaut.

Ich kam darüber zu denken, weil ich eine App bin die Migration, die ich habe dies mit Borland C ++ zu Visual Studio und in einem kleinen Teil des Codes geschrieben wurde (mit i = 0, j = 1):

v[i][j]; //v is a std::vector<std::vector<int> >

Die Größe des Vektors 'v' [0] [1] (so Element 0 des Vektors nur ein Element aufweist). Dies ist nicht definiertes Verhalten, ich weiß, aber Borland 0 Rückkehr hier, VS abstürzt. Ich mag den Absturz besser als 0 zurückkehrt, so dass, wenn ich mehr ‚Abstürze‘ bekommen kann durch die std :: out_of_range Ausnahme geworfen wurde, würde die Migration schneller abgeschlossen werden (so würde es mehr Fehler machen, den Borland versteckt).

War es hilfreich?

Lösung

Visual Studio 2005 und 2008 bereits über die Überprüfung Grenzen-on operator[] standardmäßig in beide Debug- und Release-Builds.

Das Makro dieses Verhalten zu steuern, ist _SECURE_SCL . Setzen Sie ihn auf 0 zu Grenzen Prüfung zu deaktivieren.

Ihr aktueller Plan in VS2010 ist Grenzen Prüfung standardmäßig zu deaktivieren in Release-Builds, aber es hält im Debug auf. (Das Makro wird auch umbenannt immer _ITERATOR_DEBUG_LEVEL. Ich weiß nicht, ob es irgendeine formale Dokumentation auf es noch nicht, aber es erwähnt worden ist hier und hier )

Andere Tipps

Aktivieren Sie die Flagge _GLIBCXX_DEBUG die Überprüfung der Grenzen auf STL-Containern zu tun, wie hier diskutiert: http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html

Ich fragte dies zu früh, aber ich bin Entsendung die Antwort sowieso so dass ich einige Kenntnisse bin zu teilen.

Die stl in Visual Studio implementiert bereits tun Überprüfung Grenzen, wenn im Debug-Modus kompiliert. Dies kann am <vector> Header zu sehen:

reference operator[](size_type _Pos)
        {   // subscript mutable sequence

 #if _HAS_ITERATOR_DEBUGGING
        if (size() <= _Pos)
            {
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }
 #endif /* _HAS_ITERATOR_DEBUGGING */
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());

        return (*(_Myfirst + _Pos));
        }

so sind dort die Grenzen für die Vektorklasse überprüfen. Ich habe nicht in anderen Behältern aussehen, aber ich bin zuversichtlich, dass sie den gleichen Mechanismus haben.

Ich habe keinen Zugriff auf jeden Windows-Rechner jetzt. Aber wenn ich die STL-Implementierung prüfe mit g ++ geliefert auf meinem Mac OS X-Maschine, von /usr/include/c++/4.0.0/bits/stl_vector.h:

  // element access
  /**
   *  @brief  Subscript access to the data contained in the %vector.
   *  @param n The index of the element for which data should be
   *  accessed.
   *  @return  Read/write reference to data.
   *
   *  This operator allows for easy, array-style, data access.
   *  Note that data access with this operator is unchecked and
   *  out_of_range lookups are not defined. (For checked lookups
   *  see at().)
   */
  reference
  operator[](size_type __n)
  { return *(begin() + __n); }

Keine Prüfung durchgeführt, obwohl Ereignis im Debug-Modus. Kein _GLIBCXX_DEBUG marcro wird hier in diesem Code ausgecheckt.

Haben Sie einen Blick in Ihre eigenen STL-Implementierung mit MSVC geliefert und sehen, was geschieht. Wenn keine Prüfung in jedem Fall peformed ist ... Sie haben keine andere Wahl, als mit at () .. :-(

C ++ definiert Vektoroperator [] als nicht Ausnahme aus Gründen der Geschwindigkeit zu werfen.

Ich würde raten Ihnen die Anwendung in Debug-Konfiguration für eine Weile zu testen, bis Sie Vertrauen gewinnen, dass die große „versteckt“ Bugs verschwunden.

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