<?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[Speicherbereich von Element wird überschrieben]]></title><description><![CDATA[<p>Hallo Alle zusammen,</p>
<p>ich hab ein ziemlich komisches Problem, und weiss nicht recht genau, wie ich das erklären soll. Also ich hab eine Klasse A definiert, welche verschiedene Elemente und Methoden implementiert hat. Auf diese Elemente greife ich über die Methoden drauf zu, alle Elemente sind dann private und die Methoden klar public. Nun habe ich eine Instanz von der Klasse A in einer anderen Klasse B angelegt, das ist meine sozusagen Basisklasse, von der aus ich verschiedene Klassen C,D,E noch aufrufe. Um auf das gleiche Objekt der Klasse A immer zugreifen zu können, verzweige ich mit dem Zeiger aus den verschiedenen Klassen C,D,E auf das Objekt der Klasse A in der Klasse B.</p>
<p>Nach paar Manipulierungen der Elemente der Klasse A, werden einige Elemente überschrieben, obwohl ich diese überhaupt nicht angefasst habe. Jetzt frage ich mich warum...<br />
...hier noch ein paar Code-Schnipsel:</p>
<p>Klasse A Header:</p>
<pre><code class="language-cpp">...
private:
		CString arrayT1[30][8];
		CString m_z_dbUser;
		CString m_z_dbName;
		CString m_z_servername;
		CString m_z_servertype;
		CString m_q_dbUser;
		CString m_q_dbName;
		CString m_q_server;
		CString m_q_servertype;
		CString m_q_db_password;
		CString m_q_sa_password;
		CString m_q_repository;
		CString m_plan_owner;
		CString m_log_verzeichnis;
		CString m_export_verzeichnis;
		CString m_z_db_password;
		CString m_z_sa_password;
		CString m_z_repository;
		CString m_paketname;
		CString m_system;
public:
	void SetZielDBUser(CString dbuser);
	CString GetZielDBUser();

	void SetZielDBName(CString dbname);
	CString GetZielDBName();

	void SetZielServerName(CString servername);
	CString GetZielServername();

	void DeleteArray();

...
</code></pre>
<p>Verzweigen auf den Zeiger der Klasse B (Objekt der Klasse A erstellt) in Klassen C,D,E:</p>
<pre><code class="language-cpp">Klasse_B* Klasse_B_objekt = (Klasse_B*)AfxGetMainWnd();
	Klasse_B_objekt-&gt;Klasse_A_objekt.SetSystem(value); //!!
</code></pre>
<p>...an dieser Stelle (!!) sind die Elemente der Klasse A noch so, wie ich sie will</p>
<p>...nach dem Aufruf der Methode DeleteArray() werden auf einmal alle anderen Elemente auch gelöscht, obwohl diese nicht von betroffen sind.</p>
<pre><code class="language-cpp">Klasse_B* Klasse_B_objekt= (Klasse_B*)AfxGetMainWnd();
	  Klasse_B_objekt-&gt;Klasse_A_objekt.DeleteArray(); //Aufruf DeleteArray()
	  m_system=  Klasse_B-&gt;Klasse_A_objekt.GetSystem();//Element m_system plötzlich leer!!!!
</code></pre>
<p>Methode DeleteArray:</p>
<pre><code class="language-cpp">void Klasse_A::DeleteArray()
{
	for (int i=0;i&lt;=30;i++) {
		for (int j=0;j&lt;=7;j++) {
			arrayT1[i][j] = &quot;&quot;;	
		}
	}
}
</code></pre>
<p>Weiss jemand vielleicht ne Erklärung zu?</p>
<p>Gruss,<br />
chullain</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171797/speicherbereich-von-element-wird-überschrieben</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 22:28:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171797.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Jan 2007 13:57:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Mon, 29 Jan 2007 13:57:19 GMT]]></title><description><![CDATA[<p>Hallo Alle zusammen,</p>
<p>ich hab ein ziemlich komisches Problem, und weiss nicht recht genau, wie ich das erklären soll. Also ich hab eine Klasse A definiert, welche verschiedene Elemente und Methoden implementiert hat. Auf diese Elemente greife ich über die Methoden drauf zu, alle Elemente sind dann private und die Methoden klar public. Nun habe ich eine Instanz von der Klasse A in einer anderen Klasse B angelegt, das ist meine sozusagen Basisklasse, von der aus ich verschiedene Klassen C,D,E noch aufrufe. Um auf das gleiche Objekt der Klasse A immer zugreifen zu können, verzweige ich mit dem Zeiger aus den verschiedenen Klassen C,D,E auf das Objekt der Klasse A in der Klasse B.</p>
<p>Nach paar Manipulierungen der Elemente der Klasse A, werden einige Elemente überschrieben, obwohl ich diese überhaupt nicht angefasst habe. Jetzt frage ich mich warum...<br />
...hier noch ein paar Code-Schnipsel:</p>
<p>Klasse A Header:</p>
<pre><code class="language-cpp">...
private:
		CString arrayT1[30][8];
		CString m_z_dbUser;
		CString m_z_dbName;
		CString m_z_servername;
		CString m_z_servertype;
		CString m_q_dbUser;
		CString m_q_dbName;
		CString m_q_server;
		CString m_q_servertype;
		CString m_q_db_password;
		CString m_q_sa_password;
		CString m_q_repository;
		CString m_plan_owner;
		CString m_log_verzeichnis;
		CString m_export_verzeichnis;
		CString m_z_db_password;
		CString m_z_sa_password;
		CString m_z_repository;
		CString m_paketname;
		CString m_system;
public:
	void SetZielDBUser(CString dbuser);
	CString GetZielDBUser();

	void SetZielDBName(CString dbname);
	CString GetZielDBName();

	void SetZielServerName(CString servername);
	CString GetZielServername();

	void DeleteArray();

...
</code></pre>
<p>Verzweigen auf den Zeiger der Klasse B (Objekt der Klasse A erstellt) in Klassen C,D,E:</p>
<pre><code class="language-cpp">Klasse_B* Klasse_B_objekt = (Klasse_B*)AfxGetMainWnd();
	Klasse_B_objekt-&gt;Klasse_A_objekt.SetSystem(value); //!!
</code></pre>
<p>...an dieser Stelle (!!) sind die Elemente der Klasse A noch so, wie ich sie will</p>
<p>...nach dem Aufruf der Methode DeleteArray() werden auf einmal alle anderen Elemente auch gelöscht, obwohl diese nicht von betroffen sind.</p>
<pre><code class="language-cpp">Klasse_B* Klasse_B_objekt= (Klasse_B*)AfxGetMainWnd();
	  Klasse_B_objekt-&gt;Klasse_A_objekt.DeleteArray(); //Aufruf DeleteArray()
	  m_system=  Klasse_B-&gt;Klasse_A_objekt.GetSystem();//Element m_system plötzlich leer!!!!
</code></pre>
<p>Methode DeleteArray:</p>
<pre><code class="language-cpp">void Klasse_A::DeleteArray()
{
	for (int i=0;i&lt;=30;i++) {
		for (int j=0;j&lt;=7;j++) {
			arrayT1[i][j] = &quot;&quot;;	
		}
	}
}
</code></pre>
<p>Weiss jemand vielleicht ne Erklärung zu?</p>
<p>Gruss,<br />
chullain</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219209</guid><dc:creator><![CDATA[chullain]]></dc:creator><pubDate>Mon, 29 Jan 2007 13:57:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 07:28:20 GMT]]></title><description><![CDATA[<p>Und Du bist sicher, dass Dein MainWnd vom Typ Klasse_B ist, bzw. von Klasse_B direkt abgeleitet ist?<br />
Klasse_B* Klasse_B_objekt= (Klasse_B*)AfxGetMainWnd();</p>
<p>Oder hast Du hier etwa mehrfach Vererbung verwendet.<br />
Wie ist Dein CMainWnd deklariert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219543</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 30 Jan 2007 07:28:20 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 08:59:31 GMT]]></title><description><![CDATA[<p>nein, es findet keine Vererbung statt, ich erstelle nur eine Instanz in der CWinApp-Klasse von meiner Klasse_B und übertrage die Adresse des Zeigers an m_pMainWnd, also so:</p>
<pre><code class="language-cpp">CMenue dlg;
	m_pMainWnd = &amp;dlg;
</code></pre>
<p>...in der Klasse B lege ich ne Instanz der Klasse A an...</p>
<pre><code class="language-cpp">class Klasse_B: public CDialog
{
...
Klasse_A container;
...
}
</code></pre>
<p>...um dann in den anderen Klassen C,D,E auf das Objekt der Klasse A zugreifen zu können:</p>
<pre><code class="language-cpp">Klasse_B* Klasse_B_objekt= (Klasse_B*)AfxGetMainWnd();
      m_system=  Klasse_B-&gt;container.GetSystem();
</code></pre>
<p>...oder muss ich die Klasse A am Besten in der CWinApp Klasse schon mal anlegen und dann über den MainWnd aus den Kalssen C,D,E auf die CWinApp-Klasse zugreifen?</p>
<p>Gruss,<br />
chullain</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219595</guid><dc:creator><![CDATA[chullain]]></dc:creator><pubDate>Tue, 30 Jan 2007 08:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:08:02 GMT]]></title><description><![CDATA[<p>Das MainWnd ist, wenn ich jetzt deinen Code richtig deute, ein CMenu-Objekt (schon diese Zuweisung sollte imho nicht funktionieren) - das wandelst du um in ein Klasse_B-Objekt, das damit überhaupt nicht verwandt ist. Also interpretierst du irgendwelche (möglicherweise unbelegten) Speicherbereiche als Klasse_B, da kann nur Müll herauskommen.</p>
<p>(Und nebenbei wird das lokal angelegte Objekt, das du als Hauptfenster angemeldet hast, am Ende der Init-Funktion wieder pulverisiert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219601</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:08:02 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:14:55 GMT]]></title><description><![CDATA[<p>wie spreche ich dann das Objekt der Klasse A aus den Klassen C,D,E an, wenn ich das Objekt der Klasse A in der Klasse B erstellt habe. Ich meine das Objekt der Klasse B ist die ganze Zeit aktiv, auch wenn ich andere Dialogfenster der Klassen C,D,E auf habe...</p>
<p>...über referenzierung klappt das irgendwie auch nicht...</p>
<p>Gruss,<br />
chullain</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219609</guid><dc:creator><![CDATA[chullain]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:14:55 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:18:38 GMT]]></title><description><![CDATA[<p>Solange du das Klasse_B-Objekt <em>hast</em>, kannst du über . (bei Zeigern -&gt;) auch auf dessen Member zugreifen. Aber aus deinem Code kann man nicht erkennen, wo das Objekt angelegt wurde (und das ist wichtig um zu wissen, ob es noch exisitert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219614</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:26:53 GMT]]></title><description><![CDATA[<p>..also in der Klasse B werden alle anderen Objekte (Dialoge) erzeugt, jedoch schliesse ich nicht das Objekt der Klasse_B</p>
<pre><code class="language-cpp">void Klasse B::OnRepositoryOperation() 
{
...
    Klasse_C repoOperation(this);
...
}
</code></pre>
<pre><code class="language-cpp">BOOL Klasse_C::OnSetActive() 
{
...
Klasse_B* Klasse_B_objekt= (Klasse_B*)AfxGetMainWnd();
...
}
</code></pre>
<p>...irgendwann überschreibe ich nur den Speicherbereich einer Variable, denn ich eigentlich überhaupt nicht angefasst habe...und das ist ärgerlich...</p>
<p>Gruss,<br />
chullain</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219618</guid><dc:creator><![CDATA[chullain]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:29:54 GMT]]></title><description><![CDATA[<p>chullain schrieb:</p>
<blockquote>
<p>..also in der Klasse B werden alle anderen Objekte (Dialoge) erzeugt, jedoch schliesse ich nicht das Objekt der Klasse_B</p>
</blockquote>
<p>Ja, sehr schön - aber <strong>WO LEGST DU DEIN 'Klasse_B' OBJEKT AN?</strong> Bevor du diese Frage nicht beantwortet hast, kommen wir nicht weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219624</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:40:33 GMT]]></title><description><![CDATA[<p>ja, hab ich doch schon erwähnt in meiner CWinApp-Klasse, also der Hauptklasse der Anwendung...</p>
<p>Header:</p>
<pre><code class="language-cpp">class CAPIApp : public CWinApp
{
public:
	CAPIApp();
...
}
</code></pre>
<p>*.cpp</p>
<pre><code class="language-cpp">BOOL CAPIApp::InitInstance()
{
...
	Klasse_B dlg;
	m_pMainWnd = &amp;dlg;
...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1219636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219636</guid><dc:creator><![CDATA[chullain]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:40:33 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 09:45:16 GMT]]></title><description><![CDATA[<p>chullain schrieb:</p>
<blockquote>
<pre><code class="language-cpp">BOOL CAPIApp::InitInstance()
{
...
	Klasse_B dlg;
	m_pMainWnd = &amp;dlg;
...
}
</code></pre>
</blockquote>
<p>Und da haben wir auch schon das Problem. Dein Objekt 'dlg' liegt lokal in der InitInstance()-Methode. Das bedeutet, am Ende der Methode wird es wieder demontiert und sein Speicherplatz kann von der nächsten verwendeten Funktion neu überschrieben werden. Leg das Objekt also besser an einem Ort an, wo es bis zum Programmende überleben kann, z.B. als <em>static</em> Variable in der InitInstance(), als globale Variable oder als Member der CAPIApp-Klasse (ich würde letzteres bevorzugen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219638</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 30 Jan 2007 09:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 11:37:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:<br />
Aber wenn es das normale Design einer Dialog-Applkation ist, dann ist dieses Objekt so lange gültig, wie auch DoModal läuft.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6828">@chullain</a>:<br />
Aber das eigentliche Problem sehe ich jetzt:</p>
<pre><code class="language-cpp">// Deklaration
CString arrayT1[30][8];

// Code
void Klasse_A::DeleteArray()
{
    for (int i=0;i&lt;=30;i++) {
    //             ^ HIER IST DER BUG!
        for (int j=0;j&lt;=7;j++) {
            arrayT1[i][j] = &quot;&quot;;    
        }
    }
}
</code></pre>
<p>Array überlauf! Du darfst nur bis &lt;30 gehen!</p>
<p>Gewöhne dir immer an mit &lt; zu testen und den die Größe des Arrays als Vergleichswert zu nutzen.</p>
<p>Noch besser Du verwendest _countof oder einen ähnlichen Makro:</p>
<pre><code class="language-cpp">void Klasse_A::DeleteArray()
{
    for (int i=0; i&lt;_countof(arrayT1); ++i) 
    {
        for (int j=0; j&lt;_countof(arrayT1[0]); ++j) 
            arrayT1[i][j].Empty();    
    }
}
</code></pre>
<p>BTW: Zum Löschen von CString verwende Empty()!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219719</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 30 Jan 2007 11:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherbereich von Element wird überschrieben on Tue, 30 Jan 2007 14:34:21 GMT]]></title><description><![CDATA[<p>das wars gewesen, vielen lieben Dank.</p>
<p>Gruss,<br />
chullain</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1219856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1219856</guid><dc:creator><![CDATA[chullain]]></dc:creator><pubDate>Tue, 30 Jan 2007 14:34:21 GMT</pubDate></item></channel></rss>