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.