sinnvoll "index out of range" debbugen
-
hast du alle Zugriffe mit einem Mutex geschützt? "Tritt immer woanders auf" klingt so ein wenig nach einem Synchronisationsproblem
-
Zugriffe sind alle mit Mutex geschützt. vorher auf dem Heap trat der Fehler auch nicht auf und das Programm war da schon multithreaded.
"assert Exception" hab ich mich schonmal dran versucht. Muss ich zugeben, dass ich nicht weiß wie ich es sinnvoll einsetzen kann. Vll eine kurze Beschreibung oder ein guter Link. Komm mit dem Programmieren eigentlich gut zurecht, nur was die exceptions angeht steh ich etwas aufm Schlauch

-
Kron schrieb:
Zugriffe sind alle mit Mutex geschützt.
Wer lockt, und wo? Wenn der Vector in einer Klasse gekapselt ist muss in dieser Klasse bei Zugriffen gelockt werden. Wenn die aufrufende Klasse lockt bringt das gar nichts.
-
Wenn also Klasse B auf ein QVector Object namens vec aus KLasse A zugreifen will, dann reicht folgendes nicht:
"QMutexLocker locker(&myMutex);
liest vec aus...
automatisches unlock durch Funktionsende bzw. locker.unlock" ?Dann würde ich sonst mal den multithreaded kram rückgängig machen, um einen solchen Fehler auszuschließen
-
doch, das reicht aus. Es muss nur in Klasse A stehen...
-
Ok, das tut es bei mir nich ;). Und wenn Klasse B nicht wirklich den vec lockt gibts es auch definitiv zugriffsfehler in meinem Programm.
Dann noch eine kurze Verständnisfrage (ist mein erster Multithread Versuch):
Klasse A hat bei mir jetzt ein paar Funktionen und eine Funktion die in einem extra Thread läuft und sich einige QVectoren von Klasse A lockt.
Klasse B hat eine Funtkion die ebenfall die Vectoren von Klasse A locken möchte, dies bisher aber fälschlicher Weise in der eigenen (KLasse
Funktion versucht hat.Reicht es jetzt wenn ich in Klasse A eine Funktion schreibe, die die entsprechenden Vectoren von Klasse A lockt und diese Funktion dann einfach in Klasse B aufrufe?
..zum unlocken dann ggf. noch eine zweite Funktion
-
das sollte reichen

-
sehr schön!
Dann euch allen schonmal vielen Dank für die schnelle Hilfe. Brauch jetzt etwas Zeit um das ganze umzusetzen und zu testen. Melde mich dann wieder obs der einzige Fehler war
-
Eine eigene Funktion zum unlocken würde ich nicht nehmen, das ist fehleranfällig (so wie ein delete auf einen Member durch den Verwender deiner Klasse zu fordern). Regel das über RAII (QMutexLocker):
class A { QMutex vec_mutex; QVector<int> vec; public: void machWasMitVec() { QMutexLocker locker(&vec_mutex); // mach was mit vec } }; class B { // private goes here public: void ichFrickelInNemNeuenThread(A& aAusAnderemThread) { aAusAnderemThread.machWasMitVec(); } };Sobald du genötigt bist, vec "aus deiner Obhut zu entlassen", hast du Probleme. In solchen Fällen IMMER nur Kopien rausrücken!
-
Also das "index out of Range" Problem trat bisher nicht mehr auf und ich denke das ist jetzt auch gelöst.
@arghonaut: Kopien rausrücken will ich möglichst vermeiden. Da es im eigentlichen Programm doch ein paar mehr Vektoren sein werden und diese jeweils mindestens 20 Mb groß sind. Das mit der Fehleranfälligkeit seh ich aber genauso. Werde mich jetzt mal in RAII einlesen und gucken wie ich das geschickt umsetze.