2010-12-28 8 views
1

Während ich die Entwicklung einer C++ Anwendung,Wie erkennen und C++ Fehler Zugriffsverletzung

Ich war mit einem einfachen list<int> *somelist = new list<int>(); , die Daten zu isolieren enthält.

Ich habe versucht, diese Liste iterieren so etwas wie dies mit:

for (list<int>::iterator j=somelist->begin();j!=somelist->end();j++) 
{ 
    //do something with *j 
} 

Wenn ich etwas mit dem Zeiger j wegen einer Kettenreaktion zu tun war die Daten, die ich für den Zugriff geht aus der Liste entfernt wurde und existiert nicht mehr.

So, ich bin mit einem Zugriffsverletzungsfehler Msg aufgefordert.

Kann mir jemand sagen, wie zu erkennen, wenn der Zeiger j eine schlechte ptr

+1

Versuchen Sie es zu debuggen – DumbCoder

Antwort

0

Mit Multi-Threading Ihre Iterator entfernt werden kann für ungültig erklärt werden, wenn ein anderer Thread Elemente aus der Liste entfernt. Mit einer Low-Level-Programmierung wie C++ gibt es keine Möglichkeit, dieses Problem zu entdecken, sobald es passiert ist. Ihre beste Wette ist zu "verhindern, dass dies passiert."

Verwenden Sie Synchronisierungsfunktionen (z. B. WaitForSingleObject in Windows), um den Zugriff auf freigegebene STL-Container zu steuern.

1

ist, kann nicht durchgeführt werden. Sie müssen die Liste beim Traversieren nicht löschen.

1

Der Fehler in Ihrem Code ist, dass Sie damit umgehen müssen, wenn Sie noch wissen, dass Sie es entfernt haben. Danach kannst du nicht mehr damit umgehen. Im folgenden Beispiel dosomething gibt true zurück, wenn das Element sollte

for (list<int>::iterator j=somelist->begin();j!=somelist->end();) { 
    if(dosomething(j)) { 
    /* should remove it! */ 
    j = somelist->erase(j); 
    } else { 
    ++j; 
    } 
} 
+0

die Situation ist eher wie zwei Threads. wo man die Liste liest, und die andere gleichzeitig Elemente aus einer Liste entfernt –

+3

@Mafahir, dann sollten Sie sicherstellen, ordnungsgemäße Synchronisierung an welchen Orten, die betroffen sind. –

+0

@Mafahir Fairoze - STL Container sind nicht threadsicher, das muss man sich merken. – DumbCoder

Verwandte Themen