<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[static class member deallocation]]></title><description><![CDATA[<p>Hallo,</p>
<p>1. Ich habe eine private static pointer class member variable.<br />
m_geometry<br />
2. Für die Speicher allocation bzw deallocation sind functionen vorhanden<br />
cvCreateMat<br />
cvReleaseMat</p>
<p>Während der declaration der statischen Variable im *.cpp file kann ich<br />
gleichzeitig die speicherallocation durchführen:</p>
<pre><code class="language-cpp">CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry = 
cvCreateMat(3,3,CV_64F);
</code></pre>
<p>Die frage ist nun: Wo oder wie ich die deallocation durchführe<br />
(cvReleaseMat) um memory leaks zu verhindern.</p>
<p>Einen Ansatz, den ich bis jetzt verfolgt habe ist:<br />
Mit einer statischen variable die Object instanzen zählen, und wenn nach<br />
meinem &quot;Object Instanz counting&quot; der destructor der letzten instanz<br />
aufgerufen wird den Speicher der statische variable m_geometry mit<br />
cvReleaseMat freigeben.</p>
<p>Dieser Ansatz ist jedoch nicht ideal :</p>
<p>_ kompliziert | fehleranfällig<br />
_ Die semantic von static wird verändert: &quot;sichtbar während mindestenz eine<br />
Instanz existiert&quot; anstatt &quot;sichtbar während der gesamten Programmlaufzeit&quot;</p>
<p>Mit dem &quot;Object Instanz counting&quot; existieren im moment immer noch memory<br />
leaks! Ich führe das auf die spezielle funktion des Copy,- und<br />
Assignment-Operatoren zurück.</p>
<p>Gut, nun zu meiner Frage. Wenn es möglich ist eine statische variable zu<br />
initialisieren (bei der declaration) dann gibt es sicher eine &quot;stelle&quot;<br />
(oder methode) an der man statische variablen deinitialisieren kann.<br />
Vielleicht einen speziellen destruktor für statische Variablen.</p>
<p>Grüsse,<br />
Gerd</p>
<p>Der Anschaulichkeit halber hier noch der Quelltext (ohne &quot;Object Instanz counting&quot;)</p>
<pre><code>//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&amp; another);
	const  MultiCameraModel::Camera_Param_Common_System&amp; operator=(const 
MultiCameraModel::Camera_Param_Common_System&amp; 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&amp; another)
{
}

const  MultiCameraModel::Camera_Param_Common_System&amp; 
MultiCameraModel::Camera_Param_Common_System::operator=(const 
MultiCameraModel::Camera_Param_Common_System&amp; right)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/135167/static-class-member-deallocation</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 22:11:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135167.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 Jan 2006 11:11:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 11:11:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>1. Ich habe eine private static pointer class member variable.<br />
m_geometry<br />
2. Für die Speicher allocation bzw deallocation sind functionen vorhanden<br />
cvCreateMat<br />
cvReleaseMat</p>
<p>Während der declaration der statischen Variable im *.cpp file kann ich<br />
gleichzeitig die speicherallocation durchführen:</p>
<pre><code class="language-cpp">CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry = 
cvCreateMat(3,3,CV_64F);
</code></pre>
<p>Die frage ist nun: Wo oder wie ich die deallocation durchführe<br />
(cvReleaseMat) um memory leaks zu verhindern.</p>
<p>Einen Ansatz, den ich bis jetzt verfolgt habe ist:<br />
Mit einer statischen variable die Object instanzen zählen, und wenn nach<br />
meinem &quot;Object Instanz counting&quot; der destructor der letzten instanz<br />
aufgerufen wird den Speicher der statische variable m_geometry mit<br />
cvReleaseMat freigeben.</p>
<p>Dieser Ansatz ist jedoch nicht ideal :</p>
<p>_ kompliziert | fehleranfällig<br />
_ Die semantic von static wird verändert: &quot;sichtbar während mindestenz eine<br />
Instanz existiert&quot; anstatt &quot;sichtbar während der gesamten Programmlaufzeit&quot;</p>
<p>Mit dem &quot;Object Instanz counting&quot; existieren im moment immer noch memory<br />
leaks! Ich führe das auf die spezielle funktion des Copy,- und<br />
Assignment-Operatoren zurück.</p>
<p>Gut, nun zu meiner Frage. Wenn es möglich ist eine statische variable zu<br />
initialisieren (bei der declaration) dann gibt es sicher eine &quot;stelle&quot;<br />
(oder methode) an der man statische variablen deinitialisieren kann.<br />
Vielleicht einen speziellen destruktor für statische Variablen.</p>
<p>Grüsse,<br />
Gerd</p>
<p>Der Anschaulichkeit halber hier noch der Quelltext (ohne &quot;Object Instanz counting&quot;)</p>
<pre><code>//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&amp; another);
	const  MultiCameraModel::Camera_Param_Common_System&amp; operator=(const 
MultiCameraModel::Camera_Param_Common_System&amp; 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&amp; another)
{
}

const  MultiCameraModel::Camera_Param_Common_System&amp; 
MultiCameraModel::Camera_Param_Common_System::operator=(const 
MultiCameraModel::Camera_Param_Common_System&amp; right)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/981861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981861</guid><dc:creator><![CDATA[aUSER]]></dc:creator><pubDate>Tue, 31 Jan 2006 11:11:10 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 11:17:15 GMT]]></title><description><![CDATA[<p>Smart Pointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981867</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Tue, 31 Jan 2006 11:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 12:01:28 GMT]]></title><description><![CDATA[<p>bei beendigung des prozesses gibt das betriebssystem allen vom prozess allozierter speicher automatisch frei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981908</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 31 Jan 2006 12:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 12:14:37 GMT]]></title><description><![CDATA[<p>smart pointers?</p>
<p>ist nicht ganz so einfach (mal davon abgesehen das ich mich mit smart pointern nicht so auskenne).</p>
<p>Habe etwas darüber gelesen:<br />
1. bei der variablen m_geometry handelt es sich um einen pointer auf eine struct. Möglicherweise funktionieren smart pointer nicht mit structs, da constructor/destructor vorrausgesetzt werden?</p>
<p>2. smart pointer != smart pointer. Es existieren sehr viele unterschiedliche und sehr spezialisierte implementationen dieses algorithmus. So weit ich das überflogen habe brauche ich einen mit &quot;POW&quot;, da in meiner klasse copy,- bzw assignment-operatoren implementiert sind. Dieser ist schon beinahe als garbage collector zu bezeichnen, dieses beeinflusst mglw. die laufzeit.</p>
<p>3. einen ähnlichen ansatz habe ich auch schon verfolgt: die object instanzen zählen, wenn der destructor der letzen instanz aufgerufen wird die statische variable deallokieren.<br />
-immer noch memory leaks (mglw. aufgrund der copy,- bzw assignment-operatoren)<br />
-die semantic von static wird verändert: &quot;sichtbar während mindestenz eine<br />
Instanz existiert&quot; anstatt &quot;sichtbar während der gesamten Programmlaufzeit&quot;</p>
<p>Kannst du mir einen &quot;smart pointer&quot; empfehlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981921</guid><dc:creator><![CDATA[aUSER]]></dc:creator><pubDate>Tue, 31 Jan 2006 12:14:37 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 12:24:21 GMT]]></title><description><![CDATA[<p>aUSER schrieb:</p>
<blockquote>
<p>Habe etwas darüber gelesen:<br />
1. bei der variablen m_geometry handelt es sich um einen pointer auf eine struct. Möglicherweise funktionieren smart pointer nicht mit structs, da constructor/destructor vorrausgesetzt werden?</p>
</blockquote>
<p>Klar funktionieren Smart Pointer mit Structs - der Compiler erstellt dir notfalls einen Default-Ctor und -Dtor, wenn du nichts eigenes geschrieben hast.</p>
<blockquote>
<p>2. smart pointer != smart pointer. Es existieren sehr viele unterschiedliche und sehr spezialisierte implementationen dieses algorithmus. So weit ich das überflogen habe brauche ich einen mit &quot;POW&quot;, da in meiner klasse copy,- bzw assignment-operatoren implementiert sind. Dieser ist schon beinahe als garbage collector zu bezeichnen, dieses beeinflusst mglw. die laufzeit.</p>
</blockquote>
<p>Du hast nur ein einziges CvMat-Objekt für die gesamte Klasse, das braucht also weder zugewiesen noch kopiert zu werden. Was würde also in dem Zusammenhang dagegen sprechen, ein statisches Objekt statt eines Pointers zu verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981936</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Tue, 31 Jan 2006 12:24:21 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 12:51:04 GMT]]></title><description><![CDATA[<p>Konfusius schrieb:</p>
<blockquote>
<p>bei beendigung des prozesses gibt das betriebssystem allen vom prozess allozierter speicher automatisch frei.</p>
</blockquote>
<p>warum muss man sich dann als c/c++ programmierer um speicherverwaltung kümmern?</p>
<p>In meiner testumgebung läuft ein memory leak checker mit stack-trace, dieser meldet ein memory leak und gibt als ursprung die initialisierung der static variable an:</p>
<p>//declaration und allocation<br />
CvMat* MultiCameraModel::Camera_Param_Common_System::m_geometry =<br />
cvCreateMat(3,3,CV_64F);</p>
<p>ist auch logisch da die deallocattions-function für die struct nicht aufgerufen wurde. die pointer variable wurde freigegeben, jedoch nicht die daten auf die der pointer zeigt. folgender aufruf muss auf die allocation folgen um den speicher wieder freizugeben.</p>
<p>cvReleaseMat( &amp;MultiCameraModel::Camera_Param_Common_System::m_geometry );</p>
<p>dieser aufruf fehlt in dem program. im destructor wäre ziemlich unsinnig, da es sich um eine static variable handelt. wo kann man den speicher für eine statische variable freigeben?</p>
<p>Die Aussage stimmt natürlich für build in types (int, double ...)</p>
<p>verwende selbst static int 'S : diese leaken nicht!</p>
<p>bei selbstdefinierten types/objekten musst du dich selbst um die speicherverwaltung kümmern. Bei meiner static member variable handelt es sich um ein objekt aus der OpenCV library. CvMat ist eine struct. mit der funktion cvCreateMat wird die CvMat struct initialisiert (der speicher wird reserviert). auf jedes cvCreateMat muss ein cvReleaseMat folgen das den speicher wieder freigibt (wie bei new/delete)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981965</guid><dc:creator><![CDATA[aUSER]]></dc:creator><pubDate>Tue, 31 Jan 2006 12:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 13:07:31 GMT]]></title><description><![CDATA[<p>Du müsstest die Aufrufe von Create bzw. Release in den Con/Destruktor einer Wrapper-Klasse packen, dann kannst du die Memory-Leaks auch abfangen:</p>
<pre><code class="language-cpp">class CvMatPtr
{
public:
  CvMatPtr(int x,int y, CV_Mode m) : data(cvCreateMat(x,y,m)) {}
  ~CvMatPtr() { cvReleaseMat(data); }
  operator CvMat*() { return data; }
private:
  CvMatPtr(const CvMatPtr&amp;);
  CvMatPtr&amp; operator=(const CvMatPtr&amp;);

  CvMat* data;
};

class Param_System
{
  ...
private:
  static CvMatPtr m_geometry;
};

CvMatPtr Param_System::m_geometry(3,3,CV_64F);
</code></pre>
<p>(Destruktoren von statischen Elementen werden am Programmende aufgerufen - und da m_geometry jetzt von einem sturen Pointer zu einem statischen Objekt aufgewertet wurde, kümmert es sich zum Abschied auch um die Ressourcen-Freigabe)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/981981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/981981</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Tue, 31 Jan 2006 13:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Tue, 31 Jan 2006 14:31:02 GMT]]></title><description><![CDATA[<p>[/quote]Du hast nur ein einziges CvMat-Objekt für die gesamte Klasse, das braucht also weder zugewiesen noch kopiert zu werden. Was würde also in dem Zusammenhang dagegen sprechen, ein statisches Objekt statt eines Pointers zu verwenden?[/quote]</p>
<p>du meintest wahrscheinlich auf dem heap bzw. stack das object anlegen.</p>
<p>stack : Objekte die kurz leben. zum beispiel innerhalb einer methode<br />
speicher muss nicht explizit freigegeben werden<br />
heap : Objekte die eine längere lebenszeit haben (z.b. new/delete;malloc/free)</p>
<p>für eine static variable scheint der stack nicht geeignet zu sein. Gut mal angenommen man macht es trotzdem. Wie</p>
<p>CvMat ist eine struct. hier der code</p>
<p>typedef struct CvMat<br />
{<br />
int type; /* CvMat signature (CV_MAT_MAGIC_VAL), element type and flags <em>/<br />
int step; /</em> full row length in bytes */</p>
<p>int* refcount; /* underlying data reference counter */</p>
<p>union<br />
{<br />
uchar* ptr;<br />
short* s;<br />
int* i;<br />
float* fl;<br />
double* db;<br />
} data; /* data pointers */</p>
<p>#ifdef __cplusplus<br />
union<br />
{<br />
int rows;<br />
int height;<br />
};</p>
<p>union<br />
{<br />
int cols;<br />
int width;<br />
};<br />
#else<br />
int rows; /* number of rows <em>/<br />
int cols; /</em> number of columns */<br />
#endif</p>
<p>} CvMat;</p>
<p>Ich weiss nicht wie man diese struct auf dem stack initialisiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982084</guid><dc:creator><![CDATA[aUSER]]></dc:creator><pubDate>Tue, 31 Jan 2006 14:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to static class member deallocation on Wed, 01 Feb 2006 07:44:08 GMT]]></title><description><![CDATA[<p>aUSER schrieb:</p>
<blockquote>
<blockquote>
<p>Du hast nur ein einziges CvMat-Objekt für die gesamte Klasse, das braucht also weder zugewiesen noch kopiert zu werden. Was würde also in dem Zusammenhang dagegen sprechen, ein statisches Objekt statt eines Pointers zu verwenden?</p>
</blockquote>
<p>du meintest wahrscheinlich auf dem heap bzw. stack das object anlegen.</p>
<p>stack : Objekte die kurz leben. zum beispiel innerhalb einer methode<br />
speicher muss nicht explizit freigegeben werden<br />
heap : Objekte die eine längere lebenszeit haben (z.b. new/delete;malloc/free)</p>
<p>für eine static variable scheint der stack nicht geeignet zu sein. Gut mal angenommen man macht es trotzdem. Wie</p>
</blockquote>
<p>Nein, statische Objekte befinden sich weder auf dem Heap noch auf dem Stack, sondern in einem eigenen Datensegment - die werden vor dem Start von main() initialisiert und irgendwo in der exit()-Behandlung wieder zerlegt.<br />
Der Pointer m_Geometry deiner Klasse ist so ein statisches Objekt, das, worauf er zeigt, liegt auf dem Heap.</p>
<p>Und wie du diese automatische Initialisierung/Zerstörung nutzen kannst, habe ich etwas weiter oben vorgeführt. Alternative Lösung wäre es, der struct selber einen Konstruktor und Destruktor zukommen zu lassen und sie dann direkt zu erzeugen statt über Hilfsfunktionen:</p>
<pre><code class="language-cpp">struct CvMat
{
  ... //Elemente wie bisher
  CvMat(int x,int y,int t);//Initialisierung wie in cvCreateMat(...)
  ~CvMat();                //Aufräumen wie in cvReleaseMat(...)
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/982708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982708</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Feb 2006 07:44:08 GMT</pubDate></item></channel></rss>