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.