<?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[doppelter speicherverbrauch]]></title><description><![CDATA[<p>ich habe ein recht seltsames problem: wenn ich ein modell vom typ infantry in eine liste packe, meinetwegen so:</p>
<pre><code class="language-cpp">else if (conf_item == &quot;models&quot;) {
// 					cur_unit-&gt;addModel(new Infantry(abstrMBoss) );
					for(int i = 0; i &lt; conf_value.toInt(); i++) {
						Infantry *model = new Infantry(1.0);
						cur_unit-&gt;addModel(model);
					}
					std::cout&lt;&lt;&quot;einheitengröße: &quot;&lt;&lt;cur_unit-&gt;size()&lt;&lt;std::endl;
				}
</code></pre>
<p>dann stimmt die einheitengröße in der liste. der witz ist aber, dass ich die unit übergeben muss:</p>
<pre><code class="language-cpp">else if (conf_item == &quot;models&quot;) {
// 					cur_unit-&gt;addModel(new Infantry(abstrMBoss) );
					for(int i = 0; i &lt; conf_value.toInt(); i++) {
						Infantry *model = new Infantry(1.0, cur_unit);
// 						model-&gt;setOwner(cur_unit);
						cur_unit-&gt;addModel(model);
					}
					std::cout&lt;&lt;&quot;einheitengröße: &quot;&lt;&lt;cur_unit-&gt;size()&lt;&lt;std::endl;
				}
</code></pre>
<p>und dann ist die liste immer exakt doppelt so groß wie sie sein dürfte.<br />
ich vermute ganz stark dass es etwas damit zu tun hat, dass ich von der model-klasse erbe, aber, warum beeinflusst das den speicherverbrauch und wie umgeh ich das am besten. denn jeder 2. eintrag scheint datenmüll zu enthalten...</p>
<p>ps: ich bin nicht so erfahren... also bitte rücksicht nehmen <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>
<pre><code class="language-cpp">class Model
{
	public:
		Model(Unit *o = NULL) {
			owner_u = owner_u;
		}

		void	inline	sSet(bool s)	{set = s;};
		bool	inline	setting()	{return set;};
		void	inline	sSelect(bool s)	{sel = s;};
		bool	inline	selected()	{return sel;};
		void	inline	sMove(bool m)	{mov = m;};
		bool	inline	moving()	{return mov;};

		void	inline	setOwner(Unit *o)	{owner_u = o; owner_u-&gt;addModel(this);};
		Unit	inline	*owner()		{return owner_u;};

		QPointF	inline	position()			{return pos;};
		void	inline	move(double x, double y)	{pos.setX(pos.x() + x); pos.setY(pos.y() + y);};// relative Bewegung
		void	inline	set_position(double x, double y){pos.setX(x); pos.setY(y);};			// absolute Positionsaenderung
		void	inline	set_position(QPointF p)		{pos.setX(p.x()); pos.setY(p.y());};		// absolute Positionsaenderung

		virtual EModelType type() = 0;
		virtual double size() = 0;
		virtual double angle()= 0;
		virtual double height() = 0;
		virtual double width() = 0;
		virtual void face(double a) = 0;
		virtual void turn(double a) = 0;
		virtual void sTurn(bool t) = 0;
		virtual bool turning() = 0;

	private:
		QPointF pos;
		Unit *owner_u;

		bool sel;
		bool mov;
		bool set;
}; 

class Infantry : public Model
{
	public:
		Infantry(double d = 1.4, Unit *o = NULL) {
			sSelect(false);
			sMove(false);
			sTurn(false);
			sSet(false);
			diam = d;
			setOwner(o);
		};

		double			inline	size()	{return diam;};

		EModelType		inline type() { return MT_INFANTRY; };

		double angle()		{return -1;};
		double height()		{return -1;};
		double width()		{return -1;};
		void face(double)	{};
		void turn(double)	{};
		void sTurn(bool)	{};
		bool turning()		{return false;};

	private:
		double diam;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/209360/doppelter-speicherverbrauch</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 14:42:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209360.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Mar 2008 18:47:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to doppelter speicherverbrauch on Sat, 29 Mar 2008 18:47:18 GMT]]></title><description><![CDATA[<p>ich habe ein recht seltsames problem: wenn ich ein modell vom typ infantry in eine liste packe, meinetwegen so:</p>
<pre><code class="language-cpp">else if (conf_item == &quot;models&quot;) {
// 					cur_unit-&gt;addModel(new Infantry(abstrMBoss) );
					for(int i = 0; i &lt; conf_value.toInt(); i++) {
						Infantry *model = new Infantry(1.0);
						cur_unit-&gt;addModel(model);
					}
					std::cout&lt;&lt;&quot;einheitengröße: &quot;&lt;&lt;cur_unit-&gt;size()&lt;&lt;std::endl;
				}
</code></pre>
<p>dann stimmt die einheitengröße in der liste. der witz ist aber, dass ich die unit übergeben muss:</p>
<pre><code class="language-cpp">else if (conf_item == &quot;models&quot;) {
// 					cur_unit-&gt;addModel(new Infantry(abstrMBoss) );
					for(int i = 0; i &lt; conf_value.toInt(); i++) {
						Infantry *model = new Infantry(1.0, cur_unit);
// 						model-&gt;setOwner(cur_unit);
						cur_unit-&gt;addModel(model);
					}
					std::cout&lt;&lt;&quot;einheitengröße: &quot;&lt;&lt;cur_unit-&gt;size()&lt;&lt;std::endl;
				}
</code></pre>
<p>und dann ist die liste immer exakt doppelt so groß wie sie sein dürfte.<br />
ich vermute ganz stark dass es etwas damit zu tun hat, dass ich von der model-klasse erbe, aber, warum beeinflusst das den speicherverbrauch und wie umgeh ich das am besten. denn jeder 2. eintrag scheint datenmüll zu enthalten...</p>
<p>ps: ich bin nicht so erfahren... also bitte rücksicht nehmen <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>
<pre><code class="language-cpp">class Model
{
	public:
		Model(Unit *o = NULL) {
			owner_u = owner_u;
		}

		void	inline	sSet(bool s)	{set = s;};
		bool	inline	setting()	{return set;};
		void	inline	sSelect(bool s)	{sel = s;};
		bool	inline	selected()	{return sel;};
		void	inline	sMove(bool m)	{mov = m;};
		bool	inline	moving()	{return mov;};

		void	inline	setOwner(Unit *o)	{owner_u = o; owner_u-&gt;addModel(this);};
		Unit	inline	*owner()		{return owner_u;};

		QPointF	inline	position()			{return pos;};
		void	inline	move(double x, double y)	{pos.setX(pos.x() + x); pos.setY(pos.y() + y);};// relative Bewegung
		void	inline	set_position(double x, double y){pos.setX(x); pos.setY(y);};			// absolute Positionsaenderung
		void	inline	set_position(QPointF p)		{pos.setX(p.x()); pos.setY(p.y());};		// absolute Positionsaenderung

		virtual EModelType type() = 0;
		virtual double size() = 0;
		virtual double angle()= 0;
		virtual double height() = 0;
		virtual double width() = 0;
		virtual void face(double a) = 0;
		virtual void turn(double a) = 0;
		virtual void sTurn(bool t) = 0;
		virtual bool turning() = 0;

	private:
		QPointF pos;
		Unit *owner_u;

		bool sel;
		bool mov;
		bool set;
}; 

class Infantry : public Model
{
	public:
		Infantry(double d = 1.4, Unit *o = NULL) {
			sSelect(false);
			sMove(false);
			sTurn(false);
			sSet(false);
			diam = d;
			setOwner(o);
		};

		double			inline	size()	{return diam;};

		EModelType		inline type() { return MT_INFANTRY; };

		double angle()		{return -1;};
		double height()		{return -1;};
		double width()		{return -1;};
		void face(double)	{};
		void turn(double)	{};
		void sTurn(bool)	{};
		bool turning()		{return false;};

	private:
		double diam;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1482814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482814</guid><dc:creator><![CDATA[spartaaa]]></dc:creator><pubDate>Sat, 29 Mar 2008 18:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to doppelter speicherverbrauch on Sat, 29 Mar 2008 21:10:35 GMT]]></title><description><![CDATA[<p>Hi spartaaa,</p>
<p>mir ist folgendes aufgefallen:</p>
<pre><code class="language-cpp">Infantry(double d = 1.4, Unit *o = NULL){
    //...
    setOwner(o);
}
</code></pre>
<pre><code class="language-cpp">void    inline    setOwner(Unit *o)    {owner_u = o; owner_u-&gt;addModel(this);};
</code></pre>
<p>Hier erzeugst du, wenn du nur einen Parameter übergibst ein undefiniertes Verhalten,<br />
da du owner_u NULL zuweist und dann auf dem (nicht vorhandenen) Objekt eine Funktion aufrufst.</p>
<p>Und der Code schmiert wirklich nicht ab? ^^</p>
<p>Wenn du allerdings eine Unit mitangibst wird einmal in setOwner addModel aufgerufen<br />
und explizit in deinem Code...<br />
Daher wahrscheinlich die doppelte Größe.</p>
<p>Was mir sonst auffällt:</p>
<pre><code class="language-cpp">Model(Unit *o = NULL) {
    owner_u = owner_u; // Die Zuweisung bewirkt gar nix...
}
</code></pre>
<p>Außerdem rufst du den Konstruktor der Basis-Klasse immer mit NULL auf, da der<br />
parameterlose Konstruktor gewählt wird, wenn kein anderer angegeben ist.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482874</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 29 Mar 2008 21:10:35 GMT</pubDate></item><item><title><![CDATA[Reply to doppelter speicherverbrauch on Sat, 29 Mar 2008 23:37:37 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Was mir sonst auffällt:</p>
<pre><code class="language-cpp">Model(Unit *o = NULL) {
    owner_u = owner_u; // Die Zuweisung bewirkt gar nix...
}
</code></pre>
</blockquote>
<p>Diese Zuweisung bewirkt einerseits erstmal gar nichts, andererseits führt sie dann aber auch dazu, dass owner_u de facto uninitialisiert ist, da es erst einen nicht definierten (sprich zufälligen) Wert erhält und diiesen dann wieder an sich selbst zuweist. Eigentlich muss es also owner_u = o; heißen;</p>
<p>Außerdem (was allerdings kein wirklicher Fehler ist) solltest du dir die Semikolons hinter den Methodendefinitionen, also zum Beispiel hier:</p>
<pre><code class="language-cpp">void    inline    sSet(bool s)    {set = s;}; //Das letzte Semikolon braucht man ncht
</code></pre>
<p>einfach weglassen, sie sind überflüssig und verwirren nur...</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482956</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sat, 29 Mar 2008 23:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to doppelter speicherverbrauch on Sun, 30 Mar 2008 03:18:38 GMT]]></title><description><![CDATA[<p>die semikolons sind wirklich etwas überflüssig und ich habe sie nur weitergeführt weil ein bekannter diese klasse so angefangen hatte... das macht man das aus gewohnheit.</p>
<p>diese zuweisung ist in der tat sinnlos, ich habe wohl in der eile einen copyfehler gemacht.</p>
<pre><code class="language-cpp">Model(Unit *o = NULL) {
    owner_u = owner_u; // Die Zuweisung bewirkt gar nix...
}
</code></pre>
<p>danke, ich habe jetzt den fehler, ich war wohl betriebsblind... THX. es war diese verdammte setOwner fkt... ich werde noch die NULL zuweisung verbessern, damits kein unvorhersehbares verhalten mehr gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482983</guid><dc:creator><![CDATA[spartaaa]]></dc:creator><pubDate>Sun, 30 Mar 2008 03:18:38 GMT</pubDate></item></channel></rss>