<?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[Problem - Falsche Verwendung von const_cast?]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>also ich habe folgendes Problem. Gegeben ist diese Klasse:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class DataSet {
public:

	// [...]

	void put_data ( const void* const pvData, const unsigned int iDataBlocks );

	// [...]

protected:

	static const unsigned short&amp; get_block_data_size ( const EBlockDataType type ) {
		return s_saBlockDataSize [ type ];
	}

	// [...]

	const unsigned short get_block_size () const {
		return get_block_data_size ( get_block_data_type () );
	}

private:

	static unsigned short s_saBlockDataSize [ 9 ];
	const void* m_pvData;
	EBlockDataType m_bdType;
	unsigned int m_iDataBlocks;
	bool m_bDataIsCopy;

	// [...]

};
</code></pre>
<p>Nun geht es um die Implementierung von DataSet::put_data(), diese sieht wie folgt aus:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void DataSet&lt;T&gt;::put_data ( const void* const pvData, const unsigned int iDataBlocks ) {
	if ( m_bDataIsCopy ) {
		if ( iDataBlocks != 0 ) {
			unsigned int iSize = iDataBlocks * get_block_size ();
			void* pvNewData;
			if ( m_pvData == NULL ) {
				pvNewData = new char [ iSize ];
				memcpy ( pvNewData, pvData, iSize );
				m_pvData = pvNewData;
			} else
			if ( iSize != m_iDataBlocks * get_block_size () ) {
				delete [] static_cast&lt;const char*&gt;( m_pvData );
				pvNewData = new char [ iSize ];
				memcpy ( pvNewData, pvData, iSize );
				m_pvData = pvNewData;
			} else {
				memcpy ( const_cast&lt;void*&gt;( m_pvData ), pvData, iSize );
			}
			m_iDataBlocks = iDataBlocks;
		} else {
			if ( m_pvData != NULL ) {
				/* (!) */ delete [] static_cast&lt;const char*&gt;( m_pvData ); /* (!) */
			}
			m_pvData = pvData;
			m_iDataBlocks = iDataBlocks;
		}
	} else {
		m_pvData = pvData;
		m_iDataBlocks = iDataBlocks;
	}
}
</code></pre>
<p>Die Klassenvorlage DataSet wird in einer von vielen Klassen verwendet, die zu einer statischen Bibliothek kompiliert werden. <em>Nun zum eigentlichen Problem:</em> Wenn ich die Bibliothek nun in einem Test-Programm einbinde und dieses starte, beobachte ich folgendes Verhalten:</p>
<p>Wenn ich die mit <strong>(!)</strong> markierte Zeile <em>nicht</em> auskommentiere, bekomme ich im Testprogramm sofort nach dem Ausführen der ersten Anweisung (die vollkommen unkritisch ist und nichts mit der Bibliothek zu tun hat) einen <strong>Segmentation fault</strong>. Ist die mit <strong>(!)</strong> markierte Zeile aber auskommentiert, läuft das Programm problemlos durch.</p>
<p>Als kleine Ergänzung möchte ich mal beschreiben, was <em>DataSet::put_data()</em> überhaupt leisten soll. Ein Objekt von der Klasse <em>DataSet</em> soll in zwei Modi operieren können, die voneinander danach unterschieden werden, ob <em>DataSet::m_bDataIsCopy</em> gesetzt ist oder nicht. Ist es gesetzt, so soll <em>DataSet::put_data()</em> eine Kopie des von pvData adressierten Speichers an der von <em>DataSet::m_pvData</em> adressierten Stelle erstellen, sofern dieser groß genug ist, andernfalls soll ein anderer Speicherbereich für <em>DataSet::m_pvData</em> reserviert werden. Ist <em>DataSet::m_bDataIsCopy</em> nicht gesetzt, soll der Zeiger <em>DataSet::m_pvData</em> einfach auf <em>pvData</em> gesetzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215717/problem-falsche-verwendung-von-const_cast</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 02:08:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215717.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 14 Jun 2008 13:35:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem - Falsche Verwendung von const_cast? on Sat, 14 Jun 2008 13:56:32 GMT]]></title><description><![CDATA[<p>Hallo erstmal,</p>
<p>also ich habe folgendes Problem. Gegeben ist diese Klasse:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class DataSet {
public:

	// [...]

	void put_data ( const void* const pvData, const unsigned int iDataBlocks );

	// [...]

protected:

	static const unsigned short&amp; get_block_data_size ( const EBlockDataType type ) {
		return s_saBlockDataSize [ type ];
	}

	// [...]

	const unsigned short get_block_size () const {
		return get_block_data_size ( get_block_data_type () );
	}

private:

	static unsigned short s_saBlockDataSize [ 9 ];
	const void* m_pvData;
	EBlockDataType m_bdType;
	unsigned int m_iDataBlocks;
	bool m_bDataIsCopy;

	// [...]

};
</code></pre>
<p>Nun geht es um die Implementierung von DataSet::put_data(), diese sieht wie folgt aus:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void DataSet&lt;T&gt;::put_data ( const void* const pvData, const unsigned int iDataBlocks ) {
	if ( m_bDataIsCopy ) {
		if ( iDataBlocks != 0 ) {
			unsigned int iSize = iDataBlocks * get_block_size ();
			void* pvNewData;
			if ( m_pvData == NULL ) {
				pvNewData = new char [ iSize ];
				memcpy ( pvNewData, pvData, iSize );
				m_pvData = pvNewData;
			} else
			if ( iSize != m_iDataBlocks * get_block_size () ) {
				delete [] static_cast&lt;const char*&gt;( m_pvData );
				pvNewData = new char [ iSize ];
				memcpy ( pvNewData, pvData, iSize );
				m_pvData = pvNewData;
			} else {
				memcpy ( const_cast&lt;void*&gt;( m_pvData ), pvData, iSize );
			}
			m_iDataBlocks = iDataBlocks;
		} else {
			if ( m_pvData != NULL ) {
				/* (!) */ delete [] static_cast&lt;const char*&gt;( m_pvData ); /* (!) */
			}
			m_pvData = pvData;
			m_iDataBlocks = iDataBlocks;
		}
	} else {
		m_pvData = pvData;
		m_iDataBlocks = iDataBlocks;
	}
}
</code></pre>
<p>Die Klassenvorlage DataSet wird in einer von vielen Klassen verwendet, die zu einer statischen Bibliothek kompiliert werden. <em>Nun zum eigentlichen Problem:</em> Wenn ich die Bibliothek nun in einem Test-Programm einbinde und dieses starte, beobachte ich folgendes Verhalten:</p>
<p>Wenn ich die mit <strong>(!)</strong> markierte Zeile <em>nicht</em> auskommentiere, bekomme ich im Testprogramm sofort nach dem Ausführen der ersten Anweisung (die vollkommen unkritisch ist und nichts mit der Bibliothek zu tun hat) einen <strong>Segmentation fault</strong>. Ist die mit <strong>(!)</strong> markierte Zeile aber auskommentiert, läuft das Programm problemlos durch.</p>
<p>Als kleine Ergänzung möchte ich mal beschreiben, was <em>DataSet::put_data()</em> überhaupt leisten soll. Ein Objekt von der Klasse <em>DataSet</em> soll in zwei Modi operieren können, die voneinander danach unterschieden werden, ob <em>DataSet::m_bDataIsCopy</em> gesetzt ist oder nicht. Ist es gesetzt, so soll <em>DataSet::put_data()</em> eine Kopie des von pvData adressierten Speichers an der von <em>DataSet::m_pvData</em> adressierten Stelle erstellen, sofern dieser groß genug ist, andernfalls soll ein anderer Speicherbereich für <em>DataSet::m_pvData</em> reserviert werden. Ist <em>DataSet::m_bDataIsCopy</em> nicht gesetzt, soll der Zeiger <em>DataSet::m_pvData</em> einfach auf <em>pvData</em> gesetzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528991</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Sat, 14 Jun 2008 13:56:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem - Falsche Verwendung von const_cast? on Sat, 14 Jun 2008 13:47:21 GMT]]></title><description><![CDATA[<p>Das seltsame verhalten kann ich mir auch nicht erklären, allerdings habe ich schon ähnliches erlebt wenn mann mit dem speicher in einer Bibliothek rumpfuscht.</p>
<p>Das Problem dabei ist, dass mit const markierte Speicherbereiche manchmal wirklich in einem rom-speicher liegen. der schreibende zugriff darauf verursacht den Fehler.</p>
<p>Außerdem riecht das nach schlechtem design wenn die daten per const übergeben werden und dennoch verändert werden. mach lieber eine extraklasse/funktion dafür oder ändere die signatur</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1528997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1528997</guid><dc:creator><![CDATA[const]]></dc:creator><pubDate>Sat, 14 Jun 2008 13:47:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem - Falsche Verwendung von const_cast? on Sat, 14 Jun 2008 13:59:04 GMT]]></title><description><![CDATA[<p>const schrieb:</p>
<blockquote>
<p>Außerdem riecht das nach schlechtem design wenn die daten per const übergeben werden und dennoch verändert werden. mach lieber eine extraklasse/funktion dafür oder ändere die signatur</p>
</blockquote>
<p>Werden sie gar nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Wenn der Copy-Flag gesetzt ist, werden sie in einen Speicherbereich kopiert, dessen Zeiger mit const markiert ist (und eventuell überschrieben, deshalb brauche ich den const_cast). Ist der Copy-Flag nicht gesetzt, werden lediglich Referenzen angepasst. Sprich: Wenn etwas verändert wird (die Daten werden überschrieben), dann handelt es sich bei den Daten sicher um eine Kopie der per const-Referenz übergebenen Daten!</p>
<p>EDIT: Habe soeben den ersten Beitrag nochmal editiert, habe es geschaft das Problem auf eine Zeile zu reduzieren (ein delete). Aber hier bin ich echt ratlos <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529000</guid><dc:creator><![CDATA[the*V*oid]]></dc:creator><pubDate>Sat, 14 Jun 2008 13:59:04 GMT</pubDate></item></channel></rss>