<?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[smartPointer]]></title><description><![CDATA[<p>Ich habe mal versucht eine eigene kleine smartPointer Klasse zu bauen um besser vertehen zu können was da genau passiert.<br />
Erst mal meine Klasse:<br />
Header:</p>
<p>#ifndef __SMARTPOINTER_H__<br />
#define __SMARTPOINTER_H__</p>
<pre><code class="language-cpp">template&lt; typename T &gt; class smartPointer
{
private:
	T* ptr;
public:
	smartPointer( );
	smartPointer( T* value );
	~smartPointer( );

	T* operator-&gt;( ) const;
	T operator*( ) const;
};

#endif __SMARTPOINTER_H__
</code></pre>
<pre><code class="language-cpp">include &quot;SmartPointer.h&quot;

template&lt; typename T &gt;
smartPointer&lt; T &gt;::smartPointer( )
{
	ptr = NULL;
	cout &lt;&lt; &quot;Called !&quot; &lt;&lt; endl;
}

template&lt; typename T &gt;
smartPointer&lt; T &gt;::smartPointer( T *value )
{
	ptr = value;
	cout &lt;&lt; &quot;Called !&quot; &lt;&lt; endl;
}

template&lt; typename T &gt;
smartPointer&lt; T &gt;::~smartPointer( )
{
	cout &lt;&lt; &quot;DESTROYED !&quot; &lt;&lt; endl;
	delete ptr;
}

template&lt; typename T &gt;
T smartPointer&lt; T &gt;::operator *( ) const
{
	return *ptr;
}

template&lt; typename T &gt;
T* smartPointer&lt; T &gt;::operator -&gt;( ) const
{
	return ptr;
}
</code></pre>
<p>Meine Main:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;

#include &quot;SmartPointer.h&quot;
#include &quot;SmartPointer.cpp&quot;

using namespace std;

class MYTESTCLASS
{
public:
	MYTESTCLASS( )
	{
	}
	~MYTESTCLASS( )
	{
	}
	void Aus( )
	{
		cout &lt;&lt; &quot;Ich bin aus MYTESTCLASS !&quot; &lt;&lt; endl;
	}
};

int main( int arg, char* arvg[ ] )
{
	smartPointer&lt; MYTESTCLASS &gt; xc( new MYTESTCLASS );
	xc-&gt;Aus( );
	{
		smartPointer&lt; MYTESTCLASS &gt; xx( xc );
		xx-&gt;Aus( );
	}
	xc-&gt;Aus( );
	return NULL;
}
</code></pre>
<p>Nun meine Frage: Warum wird der letzt Call vor dem return NULL; noch ausgeführt? In der Console steht davor auch DESTROYED. Kann mir das jemand mal erklären?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/300793/smartpointer</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 15:12:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300793.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Mar 2012 08:59:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to smartPointer on Sun, 11 Mar 2012 08:59:55 GMT]]></title><description><![CDATA[<p>Ich habe mal versucht eine eigene kleine smartPointer Klasse zu bauen um besser vertehen zu können was da genau passiert.<br />
Erst mal meine Klasse:<br />
Header:</p>
<p>#ifndef __SMARTPOINTER_H__<br />
#define __SMARTPOINTER_H__</p>
<pre><code class="language-cpp">template&lt; typename T &gt; class smartPointer
{
private:
	T* ptr;
public:
	smartPointer( );
	smartPointer( T* value );
	~smartPointer( );

	T* operator-&gt;( ) const;
	T operator*( ) const;
};

#endif __SMARTPOINTER_H__
</code></pre>
<pre><code class="language-cpp">include &quot;SmartPointer.h&quot;

template&lt; typename T &gt;
smartPointer&lt; T &gt;::smartPointer( )
{
	ptr = NULL;
	cout &lt;&lt; &quot;Called !&quot; &lt;&lt; endl;
}

template&lt; typename T &gt;
smartPointer&lt; T &gt;::smartPointer( T *value )
{
	ptr = value;
	cout &lt;&lt; &quot;Called !&quot; &lt;&lt; endl;
}

template&lt; typename T &gt;
smartPointer&lt; T &gt;::~smartPointer( )
{
	cout &lt;&lt; &quot;DESTROYED !&quot; &lt;&lt; endl;
	delete ptr;
}

template&lt; typename T &gt;
T smartPointer&lt; T &gt;::operator *( ) const
{
	return *ptr;
}

template&lt; typename T &gt;
T* smartPointer&lt; T &gt;::operator -&gt;( ) const
{
	return ptr;
}
</code></pre>
<p>Meine Main:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;

#include &quot;SmartPointer.h&quot;
#include &quot;SmartPointer.cpp&quot;

using namespace std;

class MYTESTCLASS
{
public:
	MYTESTCLASS( )
	{
	}
	~MYTESTCLASS( )
	{
	}
	void Aus( )
	{
		cout &lt;&lt; &quot;Ich bin aus MYTESTCLASS !&quot; &lt;&lt; endl;
	}
};

int main( int arg, char* arvg[ ] )
{
	smartPointer&lt; MYTESTCLASS &gt; xc( new MYTESTCLASS );
	xc-&gt;Aus( );
	{
		smartPointer&lt; MYTESTCLASS &gt; xx( xc );
		xx-&gt;Aus( );
	}
	xc-&gt;Aus( );
	return NULL;
}
</code></pre>
<p>Nun meine Frage: Warum wird der letzt Call vor dem return NULL; noch ausgeführt? In der Console steht davor auch DESTROYED. Kann mir das jemand mal erklären?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190594</guid><dc:creator><![CDATA[BlauBär]]></dc:creator><pubDate>Sun, 11 Mar 2012 08:59:55 GMT</pubDate></item><item><title><![CDATA[Reply to smartPointer on Sun, 11 Mar 2012 09:41:16 GMT]]></title><description><![CDATA[<p>Zu diesem Zeitpunkt ist nur der innere Smart-Pointer zerstört worden, der äussere lebt bis Ende <code>main()</code> . Da du aber keinen Kopierkonstruktor definiert hast, führen Kopien zu undefiniertem Verhalten (da der Speicher zweifach freigegeben wird).</p>
<p>In deinem Code könnte man einiges verbessern, hier ein paar Vorschläge:</p>
<ul>
<li>Bezeichner mit Unterstrichen am Anfang, wie <code>__SMARTPOINTER_H__</code> , sind für Compiler und Implementierung reserviert. Verwende doch <code>SMARTPOINTER_H</code> .</li>
<li>Benutze im Konstruktor die Initialisierungsliste statt Zuweisungen.</li>
<li>Verbiete Kopierkonstruktor und Zuweisungsoperator, indem du sie <code>private</code> machst. Oder implementiere sie sinnvoll.</li>
<li>Mache den Konstruktor, der ein <code>T*</code> nimmt, <code>explicit</code> , um implizite Konvertierungen von Zeigern zu verhindern.</li>
<li><code>NULL</code> steht für den Nullpointer. Missbrauche das Literal nicht für <code>int</code> s, schreibe <code>return 0;</code> oder gar nichts.</li>
<li>Du benötigst kein <code>&lt;windows.h&gt;</code> .</li>
<li>Defaultkonstruktor und Destruktor mit leerer Definition werden automatisch vom Compiler generiert, du brauchst sie nicht hinzuschreiben.</li>
<li><code>#endif __SMARTPOINTER_H__</code> ist kein gültiges C++. Du kannst aber <code>SMARTPOINTER_H</code> als Kommentar einsetzen.</li>
<li>.cpp-Dateien solltest du nie inkludieren.</li>
<li>Templatedefinitionen müssen im Header stehen. Du kannst allerdings eine separate .inl-Datei für die Implementierung verwenden und am Schluss des Schnittstellen-Headers einbinden.</li>
<li>Wenn du <code>std::cout</code> schon im Template benötigst, solltest du <code>&lt;iostream&gt;</code> auch bereits dort einbinden. Sonst muss der Benutzer des Templates daran denken, damit der Code kompiliert.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2190596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190596</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 11 Mar 2012 09:41:16 GMT</pubDate></item><item><title><![CDATA[Reply to smartPointer on Sun, 11 Mar 2012 10:15:51 GMT]]></title><description><![CDATA[<p>Wow. Vielen dank. Hab einiges ausgebessert!<br />
Wie müsste ich das mit dem Kopierkonstruktor anstellen?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190601</guid><dc:creator><![CDATA[BlauBär]]></dc:creator><pubDate>Sun, 11 Mar 2012 10:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to smartPointer on Sun, 11 Mar 2012 12:00:52 GMT]]></title><description><![CDATA[<p>BlauBär schrieb:</p>
<blockquote>
<p>Wow. Vielen dank. Hab einiges ausgebessert!<br />
Wie müsste ich das mit dem Kopierkonstruktor anstellen?</p>
<p>MfG</p>
</blockquote>
<p>Im Idealfall verbietest du Kopien, da das meist nicht gewünscht ist. Move-Konstruktor hingegen ist ein heißer Tipp.</p>
<pre><code class="language-cpp">template&lt; typename T &gt;
class smartPointer
{
  ...

  // Kopien verbieten.
  smartPointer(smartPointer&lt;T&gt; const&amp;) = delete;
  smartPointer&lt;T&gt;&amp; operator=(smartPointer&lt;T&gt; const&amp;) = delete;

  smartPointer(smartPointer&lt;T&gt;&amp;&amp; other)
    : ptr(other.ptr)
  {
    other.ptr = 0;
  }
  smartPointer&lt;T&gt;&amp; operator=(smartPointer&lt;T&gt;&amp;&amp; other)
  {
    if(ptr == other.m_ptr)
    {
      other.ptr = 0;
    }
    else
    {
      delete ptr;
      ptr = other.ptr;
      other.ptr = 0;
    }

    return *this;
  }

  ...
};
</code></pre>
<p>So ungefähr. Keine Garantie, bin gerade etwas breit. ,)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190624</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 11 Mar 2012 12:00:52 GMT</pubDate></item></channel></rss>