 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
[ news_user ] Guest
|
Posted: Mon Jan 30, 2006 11:44 pm Post subject: Static class member deallocation |
|
|
Hallo,
Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Wie kann ich die statische Klassenvariable deinitialisieren?
Gibt es spezielle destructor funktionen für statische variablen?
Grüsse,
Gerd
//HEADER
namespace MultiCameraModel
{
class Camera_Param_Common_System
{
public:
Camera_Param_Common_System(void);
~Camera_Param_Common_System(void);
Camera_Param_Common_System(const
MultiCameraModel::Camera_Param_Common_System& another);
const MultiCameraModel::Camera_Param_Common_System& operator=(const
MultiCameraModel::Camera_Param_Common_System& right);
private:
//static members
static CvMat* m_geometry;
};
}
//SOURCE
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
MultiCameraModel::Camera_Param_Common_System::Camera_Param_Common_System(void)
{
}
MultiCameraModel::Camera_Param_Common_System::~Camera_Param_Common_System(void)
{
}
MultiCameraModel::Camera_Param_Common_System::Camera_Param_Common_System(const
MultiCameraModel::Camera_Param_Common_System& another)
{
}
const MultiCameraModel::Camera_Param_Common_System&
MultiCameraModel::Camera_Param_Common_System::operator=(const
MultiCameraModel::Camera_Param_Common_System& right)
{
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Tue Jan 31, 2006 10:01 am Post subject: Re: Static class member deallocation |
|
|
On Mon, 30 Jan 2006 19:44:41 +0100, "[ news_user ]"
<waste-paste (AT) hotmail (DOT) com> wrote:
| Quote: | Hallo,
Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Wie kann ich die statische Klassenvariable deinitialisieren?
|
Die Einheit bzw. Bibliothek, wo cvCreateMat() wohnt, müsste auch eine
Funktion fürs Zerstören bzw. für die Deinitialisierung bereitstellen.
Das ist i.d.R. notwendig, wenn das Modul extern ist (z.B. in einer
Windows-DLL), denn das Hauptprogramm hat nicht unbedingt das gleiche
Heap, wie die Bibliothek. Ausserdem könnte der Zeiger auf ein
statisches Objekt zeigen, für das keine Zerstörung nötig ist (Modell-
oder Prototyp-Entwurfsmuster).
Was sagt die Dokumentation zu dieser Bibliothek aus? Nur dort werden
Sie die Antwort bekommen, ob man diesen Zeiger löschen darf, oder
muss, und wie das zu machen ist.
| Quote: | Gibt es spezielle destructor funktionen für statische variablen?
|
Manchmal schon ... wie schon gesagt, hängt es aber von der jeweiligen
Bibliothek ab.
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Georg Wall Guest
|
Posted: Tue Jan 31, 2006 2:27 pm Post subject: Re: Static class member deallocation |
|
|
[ news_user ] schrieb:
| Quote: | Hallo,
Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Wie kann ich die statische Klassenvariable deinitialisieren?
Gibt es spezielle destructor funktionen für statische variablen?
Kommt jetzt drauf an wie cvCreateMat(...) speicher allokiert. |
Ich würde da lieber mit new CvMat(3,3,CV_64F) arbeiten,
dann kannst Du auch im Destruktor mit delete den Speicher wieder
fregeben. Natürlich musst Du zuerst schauen ob einer Deiner Objekte
auf diesen Pointer verweist, bevor Du denn Speicher freigibst, also
wirst Du einen weiteren statischen member bauen müssen,
der Verweise zählt.
Gruß
Georg
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Tue Jan 31, 2006 2:54 pm Post subject: Re: Static class member deallocation |
|
|
Hallo,
[ news_user ] schrieb:
| Quote: | Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
|
Eine Factory, nehme ich an.
| Quote: | Wie kann ich die statische Klassenvariable deinitialisieren?
|
mit delete MultiCameraModel::Camera_Param_Common_System::m_geometry.
| Quote: | Gibt es spezielle destructor funktionen für statische variablen?
|
Nein. Du wirst schon selber wissen müssen, wann der Pointer nicht mehr
gebraucht wird.
Alternative:
Smart-Pointer nehmen. (z.B. std::auto_ptr oder boost::scoped_ptr)
Wenn CvMat nicht polymorph ist (unwahrscheinlich), geht auch die
triviale Lösung:
CvMat MultiCameraModel::Camera_Param_Common_System::m_geometry =
*cvCreateMat(3,3,CV_64F);
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
[ news_user ] Guest
|
Posted: Tue Jan 31, 2006 3:02 pm Post subject: Re: Static class member deallocation |
|
|
Hallo Bob,
| Quote: | Die Einheit bzw. Bibliothek, wo cvCreateMat() wohnt, müsste auch eine
Funktion fürs Zerstören bzw. für die Deinitialisierung bereitstellen.
Das ist i.d.R. notwendig, wenn das Modul extern ist (z.B. in einer
Windows-DLL), denn das Hauptprogramm hat nicht unbedingt das gleiche
Heap, wie die Bibliothek. Ausserdem könnte der Zeiger auf ein
statisches Objekt zeigen, für das keine Zerstörung nötig ist (Modell-
oder Prototyp-Entwurfsmuster).
Was sagt die Dokumentation zu dieser Bibliothek aus? Nur dort werden
Sie die Antwort bekommen, ob man diesen Zeiger löschen darf, oder
muss, und wie das zu machen ist.
|
Ja genau. Das habe ich jedoch nicht gemeint! Die deallocationsfunction ist
natürlich vorhanden - und muss ausgeführt werden um memory leaks zu
vermeiden.
Ich versuche mein Problem nochmals verständlicher darzustellen:
1. Ich habe eine private static pointer class member variable.
m_geometry
2. Für die Speicher allocation bzw deallocation sind functionen vorhanden
cvCreateMat
cvReleaseMat
Während der declaration der statischen Variable im *.cpp file kann ich
gleichzeitig die speicherallocation durchführen:
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Die frage ist nun: Wo oder wie ich die deallocation durchführe
(cvReleaseMat) um memory leaks zu verhindern.
Einen Ansatz, den ich bis jetzt verfolgt habe ist:
Mit einer statischen variable die Object instanzen zählen, und wenn nach
meinem "Object Instanz counting" der destructor der letzten instanz
aufgerufen wird den Speicher der statische variable m_geometry mit
cvReleaseMat freigeben.
Dieser Ansatz ist jedoch nicht ideal :
_ kompliziert | fehleranfällig
_ Die semantic von static wird verändert: "sichtbar während mindestenz eine
Instanz existiert" anstatt "sichtbar während der gesamten Programmlaufzeit"
Mit dem "Object Instanz counting" existieren im moment immer noch memory
leaks! Ich führe das auf die spezielle funktion des Copy,- und
Assignment-Operatoren zurück.
Gut, nun zu meiner Frage. Wenn es möglich ist eine statische variable zu
initialisieren (bei der declaration) dann gibt es sicher eine "stelle"
(oder methode) an der man statische variablen deinitialisieren kann.
Vielleicht einen speziellen destruktor für statische Variablen.
Ich hoffe das mein Problem klarer wurde. Ich suche nach einer möglichkeit
den speicher statische variablen beim programmende freizugeben. Dabei ist
ein Ansatz der ANSI conform ist bevorzugt (denkbar wäre natürlich auch den
speicher in einer plattformabhängigen "onexit" callback funktion
freizugeben)
Grüsse,
Gerd
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Heinz Ozwirk Guest
|
Posted: Tue Jan 31, 2006 3:02 pm Post subject: Re: Static class member deallocation |
|
|
"[ news_user ]" <waste-paste (AT) hotmail (DOT) com> schrieb im Newsbeitrag
news:ss8uz6hnit13.1t24qn99h07ok.dlg (AT) 40tude (DOT) net...
| Quote: | Hallo,
Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
|
Beim Beenden des Programms werden die Destruktoren aller statischen Member
Variablen ausgeführt, und zwar in der umgekehrten Reihenfolge ihrer
Erzeugung. Wenn deine nicht triviale Klassenvariable auch einen nicht
trivialen Destruktor hat, ist also alles ganz trivial.
| Quote: | Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Wie kann ich die statische Klassenvariable deinitialisieren?
|
Lass dir etwas einfallen. Nur du weißt, wofür die Variable gut ist, wann und
wofür sie gebraucht wird, was cvCreateMat tut und wie man das wieder los
wird. Globale Variablen (und dazu zähle ich auch Klassenvariablen) sind
immer mit etwas Vorsicht zu genießen und das gleiche gilt auch für Zeiger.
Trifft beides auf einander, quadrieren sich die Probleme.
Warum muss die Klassenvariable ein Zeiger auf eine Matrix sein? Würde es
eine Matrix nicht auch tun? Oder kann sich die Matrix etwa ändern? Und
selbst wenn, so oft wird das ja wohl nicht passieren, kann man die Matrix
immer noch mittels Zuweisung verändern. Oder kann man eine Matrix nur
(direkt oder indirekt) mit new erzeugen? Dann sollte die Klassenvariable
wenigstens ein auto_ptr sein.
HTH
Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Tue Jan 31, 2006 4:01 pm Post subject: Re: Static class member deallocation |
|
|
On Tue, 31 Jan 2006 11:42:23 +0100, "Heinz Ozwirk"
<hozwirk.SPAM (AT) arcor (DOT) de> wrote:
| Quote: | "[ news_user ]" <waste-paste (AT) hotmail (DOT) com> schrieb im Newsbeitrag
news:ss8uz6hnit13.1t24qn99h07ok.dlg (AT) 40tude (DOT) net...
Hallo,
Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
Beim Beenden des Programms werden die Destruktoren aller statischen Member
Variablen ausgeführt, und zwar in der umgekehrten Reihenfolge ihrer
Erzeugung. Wenn deine nicht triviale Klassenvariable auch einen nicht
trivialen Destruktor hat, ist also alles ganz trivial.
|
Ja, aber das Member ist ja ein Zeiger auf ein Objekt, das dynamisch
erstellt wurde. So werden keine Destruktoren automatisch aufgerufen...
| Quote: | Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Wie kann ich die statische Klassenvariable deinitialisieren?
Lass dir etwas einfallen. Nur du weißt, wofür die Variable gut ist, wann und
wofür sie gebraucht wird, was cvCreateMat tut und wie man das wieder los
wird. Globale Variablen (und dazu zähle ich auch Klassenvariablen) sind
immer mit etwas Vorsicht zu genießen und das gleiche gilt auch für Zeiger.
Trifft beides auf einander, quadrieren sich die Probleme.
|
Es jandelt sich hier nicht um eine globale Variable, sondern um eine
statische Member-Variable seiner Klasse...
| Quote: | Warum muss die Klassenvariable ein Zeiger auf eine Matrix sein? Würde es
eine Matrix nicht auch tun? Oder kann sich die Matrix etwa ändern? Und
selbst wenn, so oft wird das ja wohl nicht passieren, kann man die Matrix
immer noch mittels Zuweisung verändern. Oder kann man eine Matrix nur
(direkt oder indirekt) mit new erzeugen? Dann sollte die Klassenvariable
wenigstens ein auto_ptr sein.
HTH
Heinz
|
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Tue Jan 31, 2006 4:01 pm Post subject: Re: Static class member deallocation |
|
|
On Tue, 31 Jan 2006 10:54:33 +0100, Marcel Müller
<news.5.maazl (AT) spamgourmet (DOT) com> wrote:
| Quote: | Hallo,
[ news_user ] schrieb:
Ich möchte eine nicht triviale statische Klassenvariable verwenden.
Mit nicht trivial meine ich das es sich nicht um einen Basistypen
(int,double...) handelt. Daraus folgt das eine Speicher-initialisierung,-
bzw. deinitialisierung nötig ist.
Die initialisierung findet bei der Definition statt:
//DEFINITION FOR STATIC VARIABLES
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Eine Factory, nehme ich an.
Wie kann ich die statische Klassenvariable deinitialisieren?
mit delete MultiCameraModel::Camera_Param_Common_System::m_geometry.
|
Aber doch nur dann, wenn das in der Dokumentation zur externen
Bibliothek ausdrücklich angegeben wurde, oder aber man hat ohnehin
alles von den Quellen selbst kompiliert! Wenn z.B. cvCreateMat() in
einer externen Bibliothek (z.B. Windows-DLL) wohnt, funktioniert das
nur dann, wenn die CRT-Bibliothek dynamisch eingebunden wurde.
| Quote: | Gibt es spezielle destructor funktionen für statische variablen?
Nein. Du wirst schon selber wissen müssen, wann der Pointer nicht mehr
gebraucht wird.
Alternative:
Smart-Pointer nehmen. (z.B. std::auto_ptr oder boost::scoped_ptr)
|
Nur unter obigem Vorbehalt, weil alle Smart-Pointers auch irgendwann
mal "delete" auf dem Pointer aufrufen...
| Quote: | Wenn CvMat nicht polymorph ist (unwahrscheinlich), geht auch die
triviale Lösung:
CvMat MultiCameraModel::Camera_Param_Common_System::m_geometry =
*cvCreateMat(3,3,CV_64F);
|
Wenn das eine vernünftige Factory-Funktion ist, ist der
Copy-Constructor höchstwahrscheinlich nicht öffentlich oder sogar
nicht vorhanden bzw. nicht implementiert.
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Tue Jan 31, 2006 4:01 pm Post subject: Re: Static class member deallocation |
|
|
On Tue, 31 Jan 2006 11:56:51 +0100, "[ news_user ]"
<waste-paste (AT) hotmail (DOT) com> wrote:
| Quote: | Hallo Bob,
Die Einheit bzw. Bibliothek, wo cvCreateMat() wohnt, müsste auch eine
Funktion fürs Zerstören bzw. für die Deinitialisierung bereitstellen.
Das ist i.d.R. notwendig, wenn das Modul extern ist (z.B. in einer
Windows-DLL), denn das Hauptprogramm hat nicht unbedingt das gleiche
Heap, wie die Bibliothek. Ausserdem könnte der Zeiger auf ein
statisches Objekt zeigen, für das keine Zerstörung nötig ist (Modell-
oder Prototyp-Entwurfsmuster).
Was sagt die Dokumentation zu dieser Bibliothek aus? Nur dort werden
Sie die Antwort bekommen, ob man diesen Zeiger löschen darf, oder
muss, und wie das zu machen ist.
Ja genau. Das habe ich jedoch nicht gemeint! Die deallocationsfunction ist
natürlich vorhanden - und muss ausgeführt werden um memory leaks zu
vermeiden.
Ich versuche mein Problem nochmals verständlicher darzustellen:
1. Ich habe eine private static pointer class member variable.
m_geometry
2. Für die Speicher allocation bzw deallocation sind functionen vorhanden
cvCreateMat
cvReleaseMat
Während der declaration der statischen Variable im *.cpp file kann ich
gleichzeitig die speicherallocation durchführen:
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Die frage ist nun: Wo oder wie ich die deallocation durchführe
(cvReleaseMat) um memory leaks zu verhindern.
Einen Ansatz, den ich bis jetzt verfolgt habe ist:
Mit einer statischen variable die Object instanzen zählen, und wenn nach
meinem "Object Instanz counting" der destructor der letzten instanz
aufgerufen wird den Speicher der statische variable m_geometry mit
cvReleaseMat freigeben.
Dieser Ansatz ist jedoch nicht ideal :
_ kompliziert | fehleranfällig
_ Die semantic von static wird verändert: "sichtbar während mindestenz eine
Instanz existiert" anstatt "sichtbar während der gesamten Programmlaufzeit"
Mit dem "Object Instanz counting" existieren im moment immer noch memory
leaks! Ich führe das auf die spezielle funktion des Copy,- und
Assignment-Operatoren zurück.
Gut, nun zu meiner Frage. Wenn es möglich ist eine statische variable zu
initialisieren (bei der declaration) dann gibt es sicher eine "stelle"
(oder methode) an der man statische variablen deinitialisieren kann.
Vielleicht einen speziellen destruktor für statische Variablen.
|
Gerade eben wollte ich die Referenzzählende-Methode empfehlen,
allerdings bist Du da auch schon durch gewesen! In diesem Fall
würde ich die ganze Chose in einem eigenen Objekt wickeln, das als
statisches Member Deiner Klasse angelegt wird. Also eine Art "smart
pointer" speziell für diese Bibliothek bzw. dieses Objekt. Bei
Programmende wird dann mit Sicherheit aufgeräumt, wenn der Destruktor
des Objekts aufgerufenwird. Der wesentliche Unterschied besteht darin,
dass Du nunmehr ein Objekt und keinen Zeiger unterhalten bzw. pflegen
musst.
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Bob Hairgrove Guest
|
Posted: Tue Jan 31, 2006 5:02 pm Post subject: Re: Static class member deallocation |
|
|
On Tue, 31 Jan 2006 16:43:15 +0100, Bob Hairgrove
<invalid (AT) bigfoot (DOT) com> wrote:
| Quote: | jandelt
**handelt** |
--
Bob Hairgrove
NoSpamPlease (AT) Home (DOT) com
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Marcel Müller Guest
|
Posted: Tue Jan 31, 2006 7:02 pm Post subject: Re: Static class member deallocation |
|
|
Hallo,
[ news_user ] schrieb:
| Quote: | Was sagt die Dokumentation zu dieser Bibliothek aus? Nur dort werden
Sie die Antwort bekommen, ob man diesen Zeiger löschen darf, oder
muss, und wie das zu machen ist.
Ja genau. Das habe ich jedoch nicht gemeint! Die deallocationsfunction ist
natürlich vorhanden - und muss ausgeführt werden um memory leaks zu
vermeiden.
Ich versuche mein Problem nochmals verständlicher darzustellen:
1. Ich habe eine private static pointer class member variable.
m_geometry
2. Für die Speicher allocation bzw deallocation sind functionen vorhanden
cvCreateMat
cvReleaseMat
|
Das schreit förmlich nach boost::shared_ptr mit custom deleter.
boost::shared_ptr<CvMat>
MultiCameraModel::Camera_Param_Common_System::m_geometry(cvCreateMat(3,3,CV_64F),cvReleaseMat);
Ich habe jetzt mal vorausgesetzt, dass
cvReleaseMat(CvMat*);
der korrekte Ausdruck zum Freigeben der Ressourcen ist.
Bei der Verwendung von m_geometry ohne den -> Operator ist es in Folge
erforderlich m_geometry durch m_geometry.get() zu ersetzen. Sonst sind
keine Programmänderungen erforderlich.
Das funktioniert im Übrigen auch dann sicher, wenn m_geometry zur
Laufzeit ein neues Objekt zugewiesen wird.
| Quote: | Während der declaration der statischen Variable im *.cpp file kann ich
gleichzeitig die speicherallocation durchführen:
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =
cvCreateMat(3,3,CV_64F);
Die frage ist nun: Wo oder wie ich die deallocation durchführe
(cvReleaseMat) um memory leaks zu verhindern.
Einen Ansatz, den ich bis jetzt verfolgt habe ist:
Mit einer statischen variable die Object instanzen zählen, und wenn nach
meinem "Object Instanz counting" der destructor der letzten instanz
aufgerufen wird den Speicher der statische variable m_geometry mit
cvReleaseMat freigeben.
|
? - Was soll das werden?
Es gibt immer nur /eine/ Instanz einer statischen Variable.
Und die wird (automatisch) genau dann und nur dann zerstört, wenn das
Programm terminiert.
| Quote: | Gut, nun zu meiner Frage. Wenn es möglich ist eine statische variable zu
initialisieren (bei der declaration) dann gibt es sicher eine "stelle"
(oder methode) an der man statische variablen deinitialisieren kann.
Vielleicht einen speziellen destruktor für statische Variablen.
|
Nein, aber statische Objekte dürfen einen Destruktor haben und der wird
auch aufgerufen.
| Quote: | Ich hoffe das mein Problem klarer wurde. Ich suche nach einer möglichkeit
den speicher statische variablen beim programmende freizugeben. Dabei ist
ein Ansatz der ANSI conform ist bevorzugt (denkbar wäre natürlich auch den
speicher in einer plattformabhängigen "onexit" callback funktion
freizugeben)
|
s.o.: boost::shared_ptr, ist ANSI-konform.
Man könnte es zwar auch selber programmieren, das hat aber eher
didaktischen Wert, weil man dabei feststellen wird, dass es gar nich so
einfach ist, gute Smart-Pointer zu schreiben.
Marcel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
[ news_user ] Guest
|
Posted: Thu Feb 02, 2006 8:02 pm Post subject: Re: Static class member deallocation |
|
|
Hallo,
Ich habe das Problem jetzt mit boost::shared_ptr gelöst!
-DIE DEALLOCATION FUNKTIONIERT
Im folgenden beschreibe ich den Lösungsansatz:
Zuerst möchte ich noch detailreichere Informationen anfügen:
CvMat ist eine struct aus der OpenCV library (dynamischer container für
eine matrix):
typedef struct CvMat
{
int type; /* CvMat signature (CV_MAT_MAGIC_VAL), element type and
flags */
int step; /* full row length in bytes */
int* refcount; /* underlying data reference counter */
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; /* data pointers */
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows; /* number of rows */
int cols; /* number of columns */
#endif
} CvMat;
zur dynamischen memory allocation werden folgende (factory) funktionen
bereitgestellt:
CvMat* cvCreateMat( int rows, int cols, int type );
void cvReleaseMat( CvMat** mat );
Da ich mit einem eigenen reference counting algorithmus auch nicht weiter
gekommen bin habe ich mich nun für den einsatz von boost::shared_ptr
entschieden, da boost::shared_ptr auch nicht generische objekte
unterstützt, und genau das brauche ich da die struct keinen
constructor/destructor anbietet. Glücklicherweise war dieses mal das
compilieren/installieren von boost kein problem (Ich habe das schon vor 2
jahren mal mit visual studio 6 probiert, jedoch dann aufgegeben).
//header
static boost::shared_ptr<CvMat> m_geometry;
//source
void cvReleaseMatPointer(CvMat* mat)
{
cvReleaseMat(&mat);
}
boost::shared_ptr<CvMat>
MultiCameraModel::Camera_Param_Common_System::m_geometry(
cvCreateMat(3,3,CV_64F), cvReleaseMatPointer );
Da die Signaturen der factory methoden unterschiedlich sind:
CvMat* cvCreateMat( int rows, int cols, int type );
void cvReleaseMat( CvMat** mat );
muss ich eine globale wrapper function "cvReleaseMatPointer" nutzen.
Nochmals besten dank für die rege Anteilnahme. Abgesehen vom vorhandenen
Problem steht mir nun die boost library zur Verfügung, die mir in der
Zukunft wahrscheinlich noch gute Dienste leisten wird.
Grüsse,
Gerd
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|