<?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[Absturz aufgrund des Destruktors]]></title><description><![CDATA[<p>Hi,</p>
<p>hab folgendes Problem:<br />
hab hier eine Vektor-Klasse, die unter anderem 2 Vektoren addiert. Die Vektoren sollen auch addiert werden können, wenn sie unterschiedliche Dimensionen haben.<br />
Wenn ich bei unterschiedlichen Dimensionen aus den Funktionen gehe, ohne eine Berechnung durchzuführen, läuft das Programm komplett durch, wenn ich jedoch die Dimensionen berücksichtige, stürzt es beim Destruktor ab, aber wieso? Hier ein paar Code-Passagen:</p>
<pre><code class="language-cpp">CVektorDbl::~CVektorDbl()
  {
   Destroy();
  }  // Destruktor

void CVektorDbl::Destroy()
  {
   delete [] this-&gt;vek;
  }  // Destroy-Funktion
</code></pre>
<p>Plus- &amp; Minusfunktion mit unterschiedl. Dimensionen (Absturz!):</p>
<pre><code class="language-cpp">CVektorDbl operator+(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	unsigned int dim_gr, dim_kl;

	if(eins.dim&gt;zwei.dim)
	  {dim_gr=eins.dim; dim_kl=zwei.dim;}
	else
	  {dim_gr=zwei.dim; dim_kl=eins.dim;}
			// Zwischenvariablen initiiert mit den Dimensionsgrößen

	CVektorDbl erg(dim_gr);

	for(unsigned int i=0; i&lt;dim_gr; i++)
	  {
		erg.vek[i] = eins.vek[i] + zwei.vek[i];
		if(i&gt;dim_kl)
		  {
			if(dim_kl==eins.dim)
				erg.vek[i]=zwei.vek[i];
			if(dim_kl==zwei.dim)
				erg.vek[i]=eins.vek[i];
		  }
	   }
	return erg;
  }  // Überladung des &quot;+&quot;-Operators

CVektorDbl operator-(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	unsigned int dim_gr, dim_kl;

	if(eins.dim&gt;zwei.dim)
	  {dim_gr=eins.dim; dim_kl=zwei.dim;}
	else
	  {dim_gr=zwei.dim; dim_kl=eins.dim;}

	CVektorDbl erg(dim_gr);

	for(unsigned int i=0; i&lt;dim_gr; i++)
	  {
		erg.vek[i] = eins.vek[i] - zwei.vek[i];
		if(i&gt;dim_kl)
		  {
			if(dim_kl==eins.dim)
				erg.vek[i]=-zwei.vek[i];
			if(dim_kl==zwei.dim)
				erg.vek[i]=eins.vek[i];
		  }
	   }
	return erg;
  }  // Überladung des &quot;-&quot;-Operators
</code></pre>
<p>Plus- &amp; Minusfunktionen vorher (kein Absturz):</p>
<pre><code class="language-cpp">CVektorDbl operator+(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	CVektorDbl erg(eins.dim);

	for(unsigned int i=0; i&lt;erg.dim; i++)
		erg.vek[i] = eins.vek[i] + zwei.vek[i];

	return erg;
  }  // Überladung des &quot;+&quot;-Operators

CVektorDbl operator-(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	CVektorDbl erg(eins.dim);

	for(unsigned int i=0; i&lt;erg.dim; i++)
		erg.vek[i] = eins.vek[i] - zwei.vek[i];

	return erg;
  }  // Überladung des &quot;-&quot;-Operators
</code></pre>
<p>PS: wir sollen im Destuktor die Destroy-Fkt aufrufen, da es ja mal sein könnte :), dass wir eine Destroy-Fkt zwischendurch mal gebrauchen könnten...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/150808/absturz-aufgrund-des-destruktors</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 22:42:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150808.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Jun 2006 12:20:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 12:20:38 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>hab folgendes Problem:<br />
hab hier eine Vektor-Klasse, die unter anderem 2 Vektoren addiert. Die Vektoren sollen auch addiert werden können, wenn sie unterschiedliche Dimensionen haben.<br />
Wenn ich bei unterschiedlichen Dimensionen aus den Funktionen gehe, ohne eine Berechnung durchzuführen, läuft das Programm komplett durch, wenn ich jedoch die Dimensionen berücksichtige, stürzt es beim Destruktor ab, aber wieso? Hier ein paar Code-Passagen:</p>
<pre><code class="language-cpp">CVektorDbl::~CVektorDbl()
  {
   Destroy();
  }  // Destruktor

void CVektorDbl::Destroy()
  {
   delete [] this-&gt;vek;
  }  // Destroy-Funktion
</code></pre>
<p>Plus- &amp; Minusfunktion mit unterschiedl. Dimensionen (Absturz!):</p>
<pre><code class="language-cpp">CVektorDbl operator+(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	unsigned int dim_gr, dim_kl;

	if(eins.dim&gt;zwei.dim)
	  {dim_gr=eins.dim; dim_kl=zwei.dim;}
	else
	  {dim_gr=zwei.dim; dim_kl=eins.dim;}
			// Zwischenvariablen initiiert mit den Dimensionsgrößen

	CVektorDbl erg(dim_gr);

	for(unsigned int i=0; i&lt;dim_gr; i++)
	  {
		erg.vek[i] = eins.vek[i] + zwei.vek[i];
		if(i&gt;dim_kl)
		  {
			if(dim_kl==eins.dim)
				erg.vek[i]=zwei.vek[i];
			if(dim_kl==zwei.dim)
				erg.vek[i]=eins.vek[i];
		  }
	   }
	return erg;
  }  // Überladung des &quot;+&quot;-Operators

CVektorDbl operator-(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	unsigned int dim_gr, dim_kl;

	if(eins.dim&gt;zwei.dim)
	  {dim_gr=eins.dim; dim_kl=zwei.dim;}
	else
	  {dim_gr=zwei.dim; dim_kl=eins.dim;}

	CVektorDbl erg(dim_gr);

	for(unsigned int i=0; i&lt;dim_gr; i++)
	  {
		erg.vek[i] = eins.vek[i] - zwei.vek[i];
		if(i&gt;dim_kl)
		  {
			if(dim_kl==eins.dim)
				erg.vek[i]=-zwei.vek[i];
			if(dim_kl==zwei.dim)
				erg.vek[i]=eins.vek[i];
		  }
	   }
	return erg;
  }  // Überladung des &quot;-&quot;-Operators
</code></pre>
<p>Plus- &amp; Minusfunktionen vorher (kein Absturz):</p>
<pre><code class="language-cpp">CVektorDbl operator+(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	CVektorDbl erg(eins.dim);

	for(unsigned int i=0; i&lt;erg.dim; i++)
		erg.vek[i] = eins.vek[i] + zwei.vek[i];

	return erg;
  }  // Überladung des &quot;+&quot;-Operators

CVektorDbl operator-(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	CVektorDbl erg(eins.dim);

	for(unsigned int i=0; i&lt;erg.dim; i++)
		erg.vek[i] = eins.vek[i] - zwei.vek[i];

	return erg;
  }  // Überladung des &quot;-&quot;-Operators
</code></pre>
<p>PS: wir sollen im Destuktor die Destroy-Fkt aufrufen, da es ja mal sein könnte :), dass wir eine Destroy-Fkt zwischendurch mal gebrauchen könnten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081374</guid><dc:creator><![CDATA[MastaZulu]]></dc:creator><pubDate>Tue, 20 Jun 2006 12:20:38 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 12:31:03 GMT]]></title><description><![CDATA[<p>die definition der klasse und des konstruktors solltest du uns nicht vorenthalten. im übrigen</p>
<pre><code class="language-cpp">for(unsigned int i=0; i&lt;dim_gr; i++)
      {
        erg.vek[i] = eins.vek[i] + zwei.vek[i];
        if(i&gt;dim_kl)
          {
            if(dim_kl==eins.dim)
                erg.vek[i]=zwei.vek[i];
            if(dim_kl==zwei.dim)elemen
                erg.vek[i]=eins.vek[i];
          }
       }
</code></pre>
<p>hier kommt im falle unterschiedlicher dimensionen auf jeden fall undefiniertes verhalten ins spiel, denn du greifst bei einem der argumente auf elemente mit ungültigem index zu. du kannst nicht etwas undefiniertes tun und dann das im nachhinein zu korrigieren versuchen. im übrigen ist die bedingung im if ungenügend, denn der index i == dim_kl ist bereits ein ungültiger für ein argument.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081382</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 20 Jun 2006 12:31:03 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 12:41:04 GMT]]></title><description><![CDATA[<p>so, hab jetzt auf anregung durch camper neue variablen eingefügt, damit ich (hoffentlich) nicht in den unbestimmten wertebereich gelange:</p>
<pre><code class="language-cpp">CVektorDbl operator+(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	unsigned int dim_gr, dim_kl;
	double t1, t2;

	if(eins.dim&gt;zwei.dim)
	  {dim_gr=eins.dim; dim_kl=zwei.dim;}
	else
	  {dim_gr=zwei.dim; dim_kl=eins.dim;}
			// Zwischenvariablen initiiert mit den Dimensionsgrößen

	CVektorDbl erg(dim_gr);

	for(unsigned int i=0; i&lt;dim_gr; i++)
	  {
		if(i&lt;=dim_kl)
		  {
			t1=eins.vek[i];
			t2=zwei.vek[i];
        }

		if(i&gt;dim_kl)
		  {
			if(dim_kl==eins.dim)
           {
				t2=zwei.vek[i];
				erg.vek[i]=t2;
				t1=0;
           }
			if(dim_kl==zwei.dim)
			  {
				t1=eins.vek[i];
				erg.vek[i]=t1;
				t2=0;
           }
		  }
		erg.vek[i]=t1+t2;
	   }
	return erg;
  }  // Überladung des &quot;+&quot;-Operators

CVektorDbl operator-(const CVektorDbl&amp; eins, const CVektorDbl&amp; zwei)
  {
	unsigned int dim_gr, dim_kl;
	double t1, t2;

	if(eins.dim&gt;zwei.dim)
	  {dim_gr=eins.dim; dim_kl=zwei.dim;}
	else
	  {dim_gr=zwei.dim; dim_kl=eins.dim;}
			// Zwischenvariablen initiiert mit den Dimensionsgrößen

	CVektorDbl erg(dim_gr);

	for(unsigned int i=0; i&lt;dim_gr; i++)
	  {
		if(i&lt;=dim_kl)
		  {
			t1=eins.vek[i];
			t2=zwei.vek[i];
        }

		if(i&gt;dim_kl)
		  {
			if(dim_kl==eins.dim)
           {
				t2=zwei.vek[i];
				erg.vek[i]=t2;
				t1=0;
           }
			if(dim_kl==zwei.dim)
			  {
				t1=eins.vek[i];
				erg.vek[i]=t1;
				t2=0;
           }
		  }
		erg.vek[i]=t1-t2;
	   }
	return erg;
  }  // Überladung des &quot;-&quot;-Operators
</code></pre>
<p>hier noch Konstruktor sowie klasse:</p>
<pre><code class="language-cpp">CVektorDbl::CVektorDbl(unsigned int dim)
  {
	Init(dim);
  }  // Standard-Konstruktor

CVektorDbl::CVektorDbl(const CVektorDbl&amp; vek)
  {
	Init(vek.dim);
	this-&gt;operator=(vek);
  }  // Kopier-Konstruktor

void CVektorDbl::Init(unsigned int dim)
  {
 	this-&gt;dim  = dim;
	this-&gt;vek  = new double[dim];

	if (this-&gt;vek == NULL)
	  {
		cerr &lt;&lt; &quot;Kein Speicher mehr!!!&quot; &lt;&lt; endl;
		exit(-1);
     }	
	for(unsigned int i=0; i &lt; this-&gt;dim; i++) this-&gt;vek[i] = 0;
  }  // Init-Funktion
</code></pre>
<pre><code class="language-cpp">class CVektorDbl
  {
 private:
	void Init(unsigned int dim);
	void Destroy(void);

 public:
	CVektorDbl(unsigned int dim=0);
	CVektorDbl(const CVektorDbl&amp;);

	~CVektorDbl();
.
.
.
 private:
	unsigned int dim;
	double *vek;
  };
</code></pre>
<p>ich ruf z.b. die Minus-Funktion so auf:</p>
<pre><code class="language-cpp">vek1=vek2-vek3;
</code></pre>
<p>was mir aufgefallen ist, das programm stürzt nur ab, wenn z.b. vek3 die dimension 3 hat und vek2 die dimension 2, wenn sie die gleiche dimension haben, dann läuft das programm durch</p>
<p>MfG<br />
MastaZulu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081395</guid><dc:creator><![CDATA[MastaZulu]]></dc:creator><pubDate>Tue, 20 Jun 2006 12:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 12:59:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if(i&lt;=dim_kl)
</code></pre>
<p>die bedingung ist immer noch nicht streng genug. den copy-zuweisungsoperator solltest du noch zeigen. auch gibt new niemals einen null pointer zurück - im fehlerfall wird eine exception vom typ std::bad_alloc geworfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081424</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 20 Jun 2006 12:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 13:05:30 GMT]]></title><description><![CDATA[<p>hier der =-Operator:</p>
<pre><code class="language-cpp">CFolge&amp; CFolge::operator=(const CFolge&amp; zuweisung)
  {
	this-&gt;dim  = zuweisung.dim;
	this-&gt;last = zuweisung.last; 
	for(unsigned int i=0; i&lt;zuweisung.last; i++)
		this-&gt;folge[i] = zuweisung.folge[i];
	this-&gt;last=zuweisung.last;

	return *this;
  }  // überladene &quot;=&quot;-Operator-Funktion
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1081435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081435</guid><dc:creator><![CDATA[MastaZulu]]></dc:creator><pubDate>Tue, 20 Jun 2006 13:05:30 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 13:19:35 GMT]]></title><description><![CDATA[<p>wo kommen denn plötzlich last und folge her?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081448</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 20 Jun 2006 13:19:35 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 13:28:44 GMT]]></title><description><![CDATA[<p>ah! falsches programm <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="😉"
    /> sorry:</p>
<pre><code class="language-cpp">CVektorDbl&amp; CVektorDbl::operator=(const CVektorDbl&amp; gleich)
  {
	this-&gt;dim = gleich.dim;		
	for(unsigned int i=0; i&lt;gleich.dim; i++)
		this-&gt;vek[i] = gleich.vek[i];		
			// Werte des &quot;gleich&quot;-Vektors zuweisen	

	return *this;
  }  // Überladung des Zuweisungs-Operators
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1081459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081459</guid><dc:creator><![CDATA[MastaZulu]]></dc:creator><pubDate>Tue, 20 Jun 2006 13:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Absturz aufgrund des Destruktors on Tue, 20 Jun 2006 21:47:11 GMT]]></title><description><![CDATA[<p>Das solltest du nochmal überarbeiten. Was passiert denn wenn die beiden Vektoren unterschiedliche Länge haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081726</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 20 Jun 2006 21:47:11 GMT</pubDate></item></channel></rss>