Ik ben op dit moment bezig met een C++ project dat gebruikt maakt van Direct2D, KinectSDK en MFC. Hierin loop ik helaas tegen een hardnekkige memory leak aan. Om te beginnen: wat theorie over de software:
*snip*
Het programma begint in main.cpp. Deze initialiseerd de GUI en de kinectManager, deze objecten blijven bestaan tot de applicatie wordt gesloten. Verder wordt hierin ook het Kinectobject gebouwd. Deze bouwt op haar beurt alles op wat nodig is om het beeld uit de kinect te halen, te modificeren en op het scherm te brengen (NUI object, facetracking objecten, Direct2D objecten). Als dit object helemaal klaar is met haar initialisatie draait het programma stabiel en prima (geen constante memory leaks gelukkig). Het probleem is er wanneer er van kinect geswitched word: dan wordt het kinect object gedelete en deze destruct op haar beurt weer alles wat zij aan "kinderen" heeft (D2D, FT, enz.), zodat in theorie het programma terugvalt naar de staat vlak voor de initialisatie van de kinect. Hierna wordt een nieuw kinect object opgebouwd die weer alles onder zich op gaat bouwen enz.
Het is het deleten waarbij er kennelijk bepaalde objecten de destructieronde overleven en blijven bestaan, want na het aanmaken van het nieuwe Kinect object is er ongeveer 40 á 50 MB extra geheugen in gebruik.
Wat ik zelf al heb gedaan om het probleem te verhelpen:
-Ervoor gezorgd dat bij elk new keyword het object (de pointer) ook met het delete keyword te maken krijgt
-Alle D2D en Facetracking gerelateerde pointers middels Saferelease afgebroken (deze roept eerst Release() aan en zet de pointer dan op NULL).
Dit alles heeft het lek teruggebracht van rond de 120 MB naar rond de 45, maar nog niet helemaal opgelost.
Alle vormen van tips zijn welkom: onderzoekstechnieken, tutorials, directe tips (Je hebt object d aangemaakt met new, maar er daarna nooit delete op losgelaten!) etc.
Alvast bedankt!
*snip*
Het programma begint in main.cpp. Deze initialiseerd de GUI en de kinectManager, deze objecten blijven bestaan tot de applicatie wordt gesloten. Verder wordt hierin ook het Kinectobject gebouwd. Deze bouwt op haar beurt alles op wat nodig is om het beeld uit de kinect te halen, te modificeren en op het scherm te brengen (NUI object, facetracking objecten, Direct2D objecten). Als dit object helemaal klaar is met haar initialisatie draait het programma stabiel en prima (geen constante memory leaks gelukkig). Het probleem is er wanneer er van kinect geswitched word: dan wordt het kinect object gedelete en deze destruct op haar beurt weer alles wat zij aan "kinderen" heeft (D2D, FT, enz.), zodat in theorie het programma terugvalt naar de staat vlak voor de initialisatie van de kinect. Hierna wordt een nieuw kinect object opgebouwd die weer alles onder zich op gaat bouwen enz.
Het is het deleten waarbij er kennelijk bepaalde objecten de destructieronde overleven en blijven bestaan, want na het aanmaken van het nieuwe Kinect object is er ongeveer 40 á 50 MB extra geheugen in gebruik.
Wat ik zelf al heb gedaan om het probleem te verhelpen:
-Ervoor gezorgd dat bij elk new keyword het object (de pointer) ook met het delete keyword te maken krijgt
-Alle D2D en Facetracking gerelateerde pointers middels Saferelease afgebroken (deze roept eerst Release() aan en zet de pointer dan op NULL).
Dit alles heeft het lek teruggebracht van rond de 120 MB naar rond de 45, maar nog niet helemaal opgelost.
Alle vormen van tips zijn welkom: onderzoekstechnieken, tutorials, directe tips (Je hebt object d aangemaakt met new, maar er daarna nooit delete op losgelaten!) etc.
Alvast bedankt!
[ Voor 2% gewijzigd door RobIII op 29-11-2012 15:55 ]