Wyjątek "Heap corruption detected".

0

Witam!
Napisałem właśnie projekt - interpreter maszyny RAM. Wyrzuca mi błąd o ironio w jednej z ostatnich linii kodu:

http://zapodaj.net/3da5a83f37db.png.html

błąd dotyczy zmiennej dynamicznej rozkaz(typu char*), a dokładnie linii

delete rozkaz 

Dziwi mnie to, że usunięcie tego obiektu powoduje błąd, gdyż to jest sam koniec programu i już się do niego nie odwołuję. Najciekawsze jest to, że jak kliknę ignoruj to program działa normalnie dalej.

Znaczy tak właściwie odwołuje się, bo ta zmienna utworzona jest w metodzie kliknięcia buttona, ale w międzyczasie jest ona tworzona na nowo.
Tutaj link do kodu całej metody: http://pastebin.com/wikLiTF8 (tutaj jest to linia 515)
Proszę o szybką pomoc!

0

rozkaz jest tablicą 6-elementowa.
Usunąć to musisz poprzez operator

delete [] rozkaz
0

Niestety ten sam błąd.

1

@Maleficus03 pierwsze wrażenie z patrzenia na ten kod: słyszałes kiedyś o takim cudzie jak tablice i pętle?
A wracając do błędu:

char* rozkaz = new char[6];
//
 rozkaz[6]='\0'
//
et = new char [size];et[size] = '\0'
//
et_tmp = new char [size];et_tmp[size] = '\0'
//

Tablice numerujemy OD ZERA DO N-1. Co ciekawe w kilku miejscach sie do tego stosujesz i alokujesz rozmiar+1. Wiec czemu tutaj tego nie zrobiłeś? o_O
Jako że piszesz po nie swojej pamięci to psujesz sobie stertę i stąd też odpowiedni komunikat błędu.

1

Linia 204: masz tam rozkaz[6] = '\0' -> przekraczasz zakres tablicy.
BTW. funkcja, która ma kilkaset linii to średni pomysł, lepiej byłoby ją rozbić na kilka/kilkanaście mniejszych

0
Shalom napisał(a)

@Maleficus03 pierwsze wrażenie z patrzenia na ten kod: słyszałes kiedyś o takim cudzie jak tablice i pętle?

Jasne, że słyszałem, ba nawet używam ich w kilku miejscach. Pewnie chodzi Ci o te wszystkie ify, wiem, że powinienem użyć w tym miejscu kilku (jak nie kilkunastu) switchy, ale jakoś nie mam zaufania do tej instrukcji. W kilku mniejszych programikach generowała ona u mnie nieprawidłowości, a po zmianie na ify wszystko hulało aż miło.

A co do rozmiarów tablicy, to znam tą zasadę, ale czasem (nawet dość często) się zagapi i zablokuję za mało pamięci i/lub wyjadę poza zakres. W błąd wprowadziło mnie to, że wyjątek nie zgłasza się podczas wychodzenia poza swoją pamięć przez "rozkaz", a dopiero przy jego usuwaniu. Co do rozbicia metody jest to bardzo dobry pomysł, którego bałem się trochę wykorzystać ze względu na to, żejest to moja pierwsza aplikacja okienkowa i nie wiedziałem jak program zareaguje na tego typu działanie. Dziękuję wszystkim za pomoc, powiększenie tablic oczywiście pomogło. Jesteście Wielcy!

0

Jednak za wcześnie się pochwaliłem :/ W niektórych programach maszyny RAM wyrzuca mi wyjątek http://zapodaj.net/18d954697cce.png.html

Tutaj zaktualizowana wersja programu
http://pastebin.com/kvP26m2k (tutaj linia 389)

I jak zwykle nie wiem czemu, zmienna w for nie wyjeżdża poza wartość wektora.

Ok, już sobie poradziłem ;)

0

Wiesz co? Łatwiej by było gdybyś powiedział co chcesz żeby ten program robił, tak mi się wydaje.
Naprawdę musisz używać liczb magicznych?

Maleficus03 napisał(a)

(int) pole[z] == 10
mogłeś dokonać porównania

pole[z] == '\n'

Zastanawia mnie tylko, czemu nie możesz operować na stringach, tylko uczepiłeś się C-stringów?
Spróbuj przypisać " et_temp[size] = '\0' " po pętli for. Nie jestem pewien czy to zmieni coś, ale możesz spróbować, bo kompilatory mają czasem swoje wymysły.

Ale przede wszystkim. Wydaje mi się, że w tych else ifach jest mnóstwo kodu który się powtarza i można byłoby go wyciągnąć przed wszystkie porównania. Ale byćmoże się mylę

1 użytkowników online, w tym zalogowanych: 0, gości: 1