Debug Error! am Programm Ende
-
Hallo!
Ich habe in einem Programm alle Arrays durch Vektoren ersetzt. Das Programm läuft auch weiterhin komplett ohne Probleme. Nur am Ende, mit dem 'return 0;' von main gibt's einen Debug Error!: "DAMAGE: after Normal block (#153) at 0x00323E78" und ich finde den Fehler nicht. Liegt es vielleicht an der globalen Definition der Vektoren? Muss man da irgendwas beim Beenden des Progammes beachten?
Viele Grüße aus Hamburg, Niels
-
Wie hast du denn die Vektoren deklariert und definiert?
-
Niels C schrieb:
"DAMAGE: after Normal block (#153) at 0x00323E78"
Hast du irgendwo einen Buffer Overrun produziert?
-
AJ schrieb:
Wie hast du denn die Vektoren deklariert und definiert?
using namespace std;
vector<vector<int> > A;und dann später die Größe über:
A = vector<vector<int> > (m, vector<int>(m, 0));
-
\aleph_0 schrieb:
Hast du irgendwo einen Buffer Overrun produziert?
Mhmm? Wie könnte das z.B. passiert sein?
P.S.: Bin noch C++ Anfänger
-
Kann mir noch jemand helfen? Das wäre echt super!
-
Hi,
im Debugmodus haben alle Variablen, v.a. Arrys, hinten noch einen Schutzmantel, um Überbeschreiben zu verhindern.
Beispiel:
int *pInt = new int[10]; // Nehmen wir an, jemand denkt jetzt, dass das Array nicht von 0-9, sondern von 0-10 geht for (unsigned long l = 0; l < 10; ++l) pInt[l] = l; delete[] pInt; // Damage after normal block!
EDIT: Codetag -> C++
ChrisM
-
Bißchen wenig Informationen... Overrun klingt wahrscheinlich, aber Du mußt uns Code zeigen, wo Du auf den Vector schreibend zugreifst, oder an der Belegung was änderst.
-
oder du kannst es mit einem Memory Debugger wie Valgrind versuchen.
(edit "ups, hab gerade gelesen, dass du ein Anfänger bist. Dann kann es natürlich sein, dass so ein Tool dich eher verwirrt.")
-
vector<vector<int> > a; a = vector<vector<int> > (m, vector<int>(m, 0)); for (int i=0; i<m; i++) for (int k=0; k<m; k++) p[i][k] = 2;
Mehr nutze ich an sich nicht. Und das für mehrer Vektoren, teilweise statt 'int' 'double'.
Und die Inhalte werden im Programm mehrfach wieder verändert, z.B.:p[1][4] = 0;
(..)
p[1][4] = 2;
Mhmm?!
-
Was ist der Wert von m? Weißt du, dass die Indices mit 0 beginnen?
-
-
\aleph_0 schrieb:
Was ist der Wert von m?
Verschieden, je nach Programmaufruf, z.B. m = 6.
\aleph_0 schrieb:
Weißt du, dass die Indices mit 0 beginnen?
Ja, daran dürfte es nicht liegen.
-
Und wenn du erstmal .at() statt [] nimmst?
-
operator void schrieb:
Und wenn du erstmal .at() statt [] nimmst?
?!!
-
*vector::at
const_reference at(size_type pos) const;
reference at(size_type pos);
The member function returns a reference to the element of the controlled sequence at position pos.
If that position is invalid, the function throws an object of class out_of_range.
*Macht also fast das gleiche wie der []-Operator. Nur überprüft halt ob es ein Element
mit Position Pos überhaupt gibt. Wenn nicht wirft es ne Exception.
-
die std::vector<T>::at Funktion macht das gleiche wie der [] opertor nur wird überprüft ob du nicht über die Array Grenzen schreibst.
-
operator void schrieb:
Und wenn du erstmal .at() statt [] nimmst?
Wie sieht der Code konkret für einen doppelten Vektor wie oben aus?
-
// statt v[i] // schreibst du v.at(i)
-
Das ist mir klar, aber statt v[][] geht nicht v.at()(), oder?!