Czyszczenie pamięci + MFC

0

Witam,

Mam problem z samoczynną dealokacją pamięci. Pisze program śledzący i analizujący poruszające się osoby za pomocą kamerki internetowej. Do obsługi plików video i kamery używam biblioteki Video For Windows (VFW). Program za każdym razem pobiera klatkę aktualnego obrazu i poddaje ją śledzeniu. Po kilku minutach działania pojawia mi się błąd iż próbuje zapisać dane do nie zaalokowanej części pamięci.
Aplikacja pokazująca działanie programu napisana została w technologi MFC, na początku tworzony jest obiekt głównej klasy Tracking.

Utworzenie obiektu głównej klasy Tracking :
this->tracking = new Tracking(camera->getColor(),amount,margin,closedWorld);

W konstruktorze klasy Tracking tworzone są dynamicznie tablice pięciu obiektów klasy Objects.
Konstruktor klasy Tracking wygląda następująco :

 Tracking::Tracking(IMAGE* imageBinary, int amount, int margin, int closedWorld)
{			
	this->door = new Door(imageBinary);
	this->objectsMerge = new Objects(amount);
	this->objectsRow = new Objects(amount);
	this->objectsChild = new Objects(amount);
	this->objectsTemporary = new Objects(amount);
	this->objectsGlobal = new Objects(amount);
}

Klasa Objects posiada obiekty klasy Object mianowicie:

/// Wskaźnik na tablice obiektów klasy Object zawierające poszczególne skupiska pikseli.
		Object** object;

Konstruktor klasy Objects alokuje pamięć dla poszczególnych obiektów klasy Object :

 Objects::Objects(int amount)
{	
	this->count = 0;
	this->amount = amount;
	object = new Object*[this->amount];
	for(int i=0; i < this->amount; i++)
		object[i] = new Object(amount);
}

Konstruktor klasy Object alokuje pamięć dla klasy Identifiers przechowującej identyfikatory wykrytych osób oraz dla klasy Position przechowującej informacje o jej położeniu :

 Object::Object(int amount)
{	
	this->identifiers = new Identifiers(amount);
	this->location = new Position();
}

Konstruktor klasy Identifires

 Identifiers::Identifiers(int amount)
{
	this->count = 0;
	this->amount = amount;
	id = new int*[this->amount];
	for(int i=0; i< this->amount; i++)
		id[i] = new int();
}

Konstruktor klasy Position

Position::Position(void)
{
	this->Clear();
}

Pamięć zostaje zaalokowa prawidłowo, program działa również bez zarzutów. Po pewnym czasie pamięć dla jednego obiektu klasy Object zostaje zwolniona. Nie wiem z jakiego powodu i dla czego. Nigdzie w kodzie oprócz oczywiście destruktorów poszczególnych klas nie zwalniam pamięci dla żadnego obiektu opisanych wyżej klas.

Pamięć zaraz po zaalokowaniu i uruchomieniu programu:

objectsMerge->object[3]	0x00db76a0 {identifiers=0x00db7710 group=-842150451 tag=0 ...}	Object *
objectsMerge->object[4]	0x00db7be0 {identifiers=0x00db7c50 group=-842150451 tag=0 ...}	Object *
objectsMerge->object[5]	0x012b9050 {identifiers=0x012b90c0 group=-842150451 tag=0 ...}	Object *
identifiers	0x012b90c0 {id=0x012b9108 amount=15 count=0 }	Identifiers *
location	0x012b9540 {cxp=0 cyp=0 cxk=0 ...}	Position * 

Pamięć po pewnym czasie działania programu:

objectsMerge->object[3]	0x00db76a0 {identifiers=0x00db7710 group=-842150451 tag=0 ...}	Object *
objectsMerge->object[4]	0x00db7be0 {identifiers=0x00db7c50 group=-842150451 tag=0 ...}	Object * 
objectsMerge->object[5]	0x012b9050 {identifiers=0x00ff0000 group=65280 tag=0 ...}	Object *
identifiers	0x00ff0000 {id=??? amount=??? count=??? }	Identifiers *
location	0xff0000ff {cxp=??? cyp=??? cxk=??? ...}	Position * 

Nie wiem czym jest spowodowane wyczyszczenie obiektów identifiers klasy Identifiers oraz obiektu location klasy Position. Zauważyłem tylko jedną powtarzającą się sytuacje zawsze jest to obiekt 5 w tablicy obiektów objectMerge oraz nie wiem z jakiego powodu zawsze pamięć pomiędzy obiektem 4 -> 0x00db7be0 a obiektem 5 -> 0x012b9050 alokowana jest stosunkowo odlegle.
Jeśli zamienię miejscami w konstruktorze klasy Tracking utworzenie obiektu objectsMerge przykładowo z objectsRow to przedstawiona sytuacja będzie miała miejsce w obiekcie objectsRow.

0

Pamięć po pewnym czasie działania programu:

objectsMerge->object[3]	0x00db76a0 {identifiers=0x00db7710 group=-842150451 tag=0 ...}	Object *
objectsMerge->object[4]	0x00db7be0 {identifiers=0x00db7c50 group=-842150451 tag=0 ...}	Object * 
objectsMerge->object[5]	0x012b9050 {identifiers=0x00ff0000 group=65280 tag=0 ...}	Object *
identifiers	0x00ff0000 {id=??? amount=??? count=??? }	Identifiers *
location	0xff0000ff {cxp=??? cyp=??? cxk=??? ...}	Position * 

Sądząc po wartościach w object[5] (0xFF0000FF0000FF0000...) został on nadpisany bitmapą 24 bit np(RGB(255,0,0)

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