Witam.
W moim programie, który musi działać 24h / dobę wystąpił błąd.
Błąd wystąpił po kilkunastu godzinach działania. Aplikacja jest kilkuwątkowa ale locki (sekcje krytyczne) użyłem chyba wszędzie.
1/20 część zawartości funkcji PurgeTileFor:
bool Yourself::PurgeTileFor(Thing* thing, Tile* tile, UINT32 flags, std::vector<Tile*>& listTiles, std::vector<Tile*>& unavaiableTiles)
{
DATA_LOCK_CLASS lock1;
if(!tile || !thing) return false;
if(!Position::areInRange<1,1,0>(yourself->pos,tile->pos)) return false;
if(tile == yourself->getParent()) return false;
int time = 0;
unavaiableTiles.push_back(tile);
std::vector<Tile*> checkedTiles;
lock1.free();
for(;;)
{
DATA_LOCK_CLASS lock2;
if(tile->__queryAdd(thing,0,0,flags) == RET_SUCCESS) // strzałka błąd
break;
if(Function::TrueOnTime(time,15000))
return false;
reszta funkcji ...
W komentarzu powyżej napisałem "strzałka błąd".
Strzałka błąd to jest taka zielona strzałka co się w ms visual c++ 2008 wyświetla gdzie jest błąd.
A jak się na nią najedzie to jest napisane: "This is the next statament when this thread returns from the current function".
Czyli chodzi o to, że błąd jest
tam właśnie debuger pokazał błąd w linijce "DATA_LOCK_CLASS lock1" (troche niemożliwe bo tam nic takiego nie ma) ?
czy w funkcji tile->__queryAdd?
bo wydaje mi sie ze "This is the next statament" to chodzi o to "== RET_SUCCESS) "
Błąd jest dokładnie taki:
Unhandled exception at 0x04cc295c in Process.exe: 0xC0000005: Access violation writing location 0xa3040f04.
Od czego może być ten błąd?
Usunięty obiekt tile ? czy coś w funkcji tile->__queryAdd ?
Bo niby inny wątek operuje na tym obiekcie (usuwa go itd).
Ale Wg. mnie, nie powinien być usunięty akurat wtedy (Podczas funkcji PurgeTileFor).
A poza tym jak w debugerze najadę myszą na tile, to mi pokazuje ten obiekt i jego składowe itd (więc niby istnieje)
Więc gdzie może leżeć błąd?
Z góry dziękuje za pomoc.