2012-05-30 12 views
5

Czasami uzyskać to "Debug Assertion Failed" błąd mojego projektu Qt działa w trybie debugowania (image). Nie wiem, gdzie się mylę, ponieważ kompilator nic nie mówi i nie wiem, co zrobić, aby znaleźć mój błąd.Debug Assertion Failed: _CrtIsValidHeapPointer (pUserData)

Programuję pod Windows Vista, używając Qt Creator 2.4.1, Qt 4.8.1.

Mój program musi przeczytać kilka informacji z urządzenia laserowego i zapisać je do pliku z kodem podobnym do tego:

void runFunction() 
{ 
    configure_Scanning(...); 

    while(...) 
    { 
     // do something 
     scanFunction(); 
     // do something 
    } 
} 

i to jest mój „obciążone” function (gdzie myślę, że problem jest)

void scanFunction() 
{ 
    file.open(); 

    data = getDataFromDevice(); 

    if(flag) 
    { 
     if(QString::compare(lineB,"")!=0) 
     { 
      QTextStream out(&file); 
      out << lineB << endl; 
      lineB = ""; 
     } 
     lineA.append(data+"\t"); 
    } 
    else 
    { 
     if(QString::compare(lineA,"")!=0) 
     { 
      QTextStream out(&file); 
      out << lineA << endl; 
      lineA = ""; 
     } 
     lineB.prepend(data+"\t"); 
    } 

    file.close(); 
} 

Gdzie Linea i lineB są początkowo dwa nieważne QString: chodzi o to, że robię dwukierunkowe skanowanie, aby zapisać informacje w matrycy 2D (fro m -X do + X i viceversa, a Y do określonego celu). lineA zapamiętuje czytanie (-) do (+); lineB zapamiętuje czytanie (+) do (-). Kiedy zmienia się kierunek skanowania, piszę lineA (lub liniaB) do pliku i kontynuuję skanowanie.

Czy rozumiesz, co powiedziałem? Czy możesz zaproponować mi rozwiązanie?

Dzięki i przepraszam za mój angielski: P

+2

kliknij przycisk Ponów w oknie dialogowym, aby debugować program, tak jak mówi. Następnie sprawdź stos wywołań lub dodaj go do tego pytania, a powinieneś wiedzieć, co jest nie tak. W sidenote, ciągłe otwieranie i zamykanie pliku prawdopodobnie nie jest potrzebne i powoduje pewne obciążenie. – stijn

+0

Wiem, że otwieranie i zamykanie pliku na każdym etapie nie jest najlepszą strategią, ale muszę to zrobić, aby zapobiec jakiejkolwiek utracie danych w przypadku niespodziewanej przerwy. –

+0

nie jest tym, co robi 'flush()'? – stijn

Odpowiedz

10

_CrtIsValidHeapPointerUserData oznacza, że ​​masz uszkodzenie sterty, który jest zauważany przez sprawdzający debugowania sterty. Podejrzewam, że każdy, kto jest w stanie napisać dowolne informacje, do dowolnego usuniętego obiektu dynamicznego. I tak, otrzymasz stapianie zbóż nie bezwiednie przy przepisywaniu, ale na następnym sprawdzaniu sterty, które będzie wykonywane przy następnej alokacji pamięci/dealokacji. Powinien być jednak po prostu śledzony przez stos wywołań w aplikacjach z pojedynczym gwintem.

+0

Nie powiedziałem, że "mój" Qt Creator nie pozwala mi uruchomić aplikacji z debuggerem. Nie mogę więc sprawdzić żadnego błędu w czasie wykonywania. Czy możesz mi wyjaśnić, jak sprawdzić stertę? –

+0

Naprawdę nie mogę powiedzieć.Brute force way polega na zamianie WSZYSTKICH wskaźników na klasy inteligentnych wskaźników i ustawieniu ich na wysyłanie komunikatów o błędach po wykryciu problemu. – Forgottn

+0

Dobry pomysł! Ale ... Nie wiem, kiedy wykryto problem. W każdym razie spróbuję w ten sposób. Dzięki za pomysł! –