<?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[Smart Pointer]]></title><description><![CDATA[<p>Hi,<br />
ich habe langsam die Schnauze voll von dem Ewigen freigeben von Resourcen, und daher habe ich mir gedacht, dass ich mir SmartPointer bastele <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Das habe ich jetzt so gemacht:</p>
<pre><code class="language-cpp">#pragma once

template&lt;class C&gt; class CSafeBase
{
private:	
						CSafeBase(const CSafeBase&amp;)
	{
	};
						CSafeBase&amp; operator=(const CSafeBase&amp;)
	{
	};

protected:
	C					m_Type;

public:
	C&amp;					Get()
	{
						return m_Type;
	}
	const C&amp;			Get() const
	{
						return m_Type;
	}

						CSafeBase(C Type)
	{
		m_Type=Type;
	}
						virtual ~CSafeBase()
	{
	};
};

template&lt;class C&gt; class CSafe //DUMMY
{
};

template&lt;&gt; class CSafe&lt;SC_HANDLE&gt; : public CSafeBase&lt;SC_HANDLE&gt;
{
public:
						CSafe(SC_HANDLE pType) : CSafeBase(pType)
	{
	}

						~CSafe()
	{
		CloseServiceHandle(m_Type);
	}
};
//... weitere spezielle CSafe#s für andere Windows-Typen

template&lt;&gt; class CSafe&lt;void*&gt; : public CSafeBase&lt;void*&gt;
{
private:
	bool				m_bArray;

public:
						CSafe(void* pType, const bool&amp; bArray) : CSafeBase(pType)
	{
		m_bArray=bArray;
	}

						~CSafe()
	{
		if(m_bArray)
		{
			delete[] m_Type;
		}
		else
		{
			delete m_Type;
		}
	}
};
</code></pre>
<p>ist dies so OK oder seht ihr Probleme?<br />
Danke,<br />
S.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136563/smart-pointer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 12:58:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136563.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Feb 2006 12:59:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 12:59:51 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe langsam die Schnauze voll von dem Ewigen freigeben von Resourcen, und daher habe ich mir gedacht, dass ich mir SmartPointer bastele <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Das habe ich jetzt so gemacht:</p>
<pre><code class="language-cpp">#pragma once

template&lt;class C&gt; class CSafeBase
{
private:	
						CSafeBase(const CSafeBase&amp;)
	{
	};
						CSafeBase&amp; operator=(const CSafeBase&amp;)
	{
	};

protected:
	C					m_Type;

public:
	C&amp;					Get()
	{
						return m_Type;
	}
	const C&amp;			Get() const
	{
						return m_Type;
	}

						CSafeBase(C Type)
	{
		m_Type=Type;
	}
						virtual ~CSafeBase()
	{
	};
};

template&lt;class C&gt; class CSafe //DUMMY
{
};

template&lt;&gt; class CSafe&lt;SC_HANDLE&gt; : public CSafeBase&lt;SC_HANDLE&gt;
{
public:
						CSafe(SC_HANDLE pType) : CSafeBase(pType)
	{
	}

						~CSafe()
	{
		CloseServiceHandle(m_Type);
	}
};
//... weitere spezielle CSafe#s für andere Windows-Typen

template&lt;&gt; class CSafe&lt;void*&gt; : public CSafeBase&lt;void*&gt;
{
private:
	bool				m_bArray;

public:
						CSafe(void* pType, const bool&amp; bArray) : CSafeBase(pType)
	{
		m_bArray=bArray;
	}

						~CSafe()
	{
		if(m_bArray)
		{
			delete[] m_Type;
		}
		else
		{
			delete m_Type;
		}
	}
};
</code></pre>
<p>ist dies so OK oder seht ihr Probleme?<br />
Danke,<br />
S.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991500</guid><dc:creator><![CDATA[Socker]]></dc:creator><pubDate>Sat, 11 Feb 2006 12:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:19:40 GMT]]></title><description><![CDATA[<p>Sieht schon recht gut aus, allerdings würde ich noch ein paar Verbesserungen vorschlagen:<br />
a) übergibt' den bArray-Parameter an den CSave&lt;void*&gt;-Ctor besser per Wert (bool sind nicht so groß, daß du dort const Reference benötigst) und evt. mit Defaultwert.<br />
b) Bau statt eines CSafe&lt;void*&gt; lieber eine partielle Spezialisierung template&lt;typename T&gt; CSafe&lt;T*&gt; auf.<br />
c) du könntest auch noch die Vector-Operatoren (* und -&gt;) überladen.<br />
d) ich würde den CSafeBase-Copy-Ctor und Zuweisungsoperator lieber protected setzen und in CSafe eine eigene Variante definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991519</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:19:40 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:26:01 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>a. Versteh ich nicht?<br />
b. Gemacht<br />
c. Gemacht.<br />
d. Das ist mir zu aufwendig. ich brauche die Klasse hauptsächlich für lokale Funktion, welche am Anfang verschiedene WinAPI-Handels erstellen... Da brauche ich die Zuweisung einfach nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/991527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991527</guid><dc:creator><![CDATA[Socker]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:26:01 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:30:00 GMT]]></title><description><![CDATA[<p>a habe ich jetzt verstanden. ich lasse es aber so wie vorher, ab er mit defaultwert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/991530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991530</guid><dc:creator><![CDATA[Socker]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:30:06 GMT]]></title><description><![CDATA[<p>Socker schrieb:</p>
<blockquote>
<p>ist dies so OK oder seht ihr Probleme?</p>
</blockquote>
<p>Nun ja; Es übersetzt nicht, weil SC_HANDLE und 'CloseServiceHandle( SC_HANDLE )' nicht definiert sind. Davon abgesehen kann man keinen 'allgemeinen Smart-Pointer' für z.B. ein int anlegen.</p>
<p>Warum nicht einfach die sehr schönen und praxis-erprobten <a href="http://www.boost.org/libs/smart_ptr/smart_ptr.htm" rel="nofollow">Smart-Pointer</a> von boost verwenden.</p>
<p>Dort kann man auch ein CloseServiceHandle mit einbauen. Etwa so:</p>
<pre><code class="language-cpp">#include &lt;boost/shared_ptr.hpp&gt;
SC_HANDLE getHandleIrgendwoher();
typedef /*implementation depended*/ DEREF_SC_HANDLE; // bei windows-HANDLE wäre das z.B. void
    // ...
    boost::shared_ptr&lt; DEREF_SC_HANDLE&gt; hnd( getHandleIrgendwoher(), &amp;CloseServiceHandle );
    // Zugriff über hnd.get()
</code></pre>
<p>bei Löschen der letzten Kopie von 'hnd' wird CloseServiceHandle gerufen.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991531</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:39:14 GMT]]></title><description><![CDATA[<p>SC_HANDLE ist von der WindowsTreiberProgrammierung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<blockquote>
<p>Davon abgesehen kann man keinen 'allgemeinen Smart-Pointer' für z.B. ein int anlegen.</p>
</blockquote>
<p>Wollte ich ja gar nicht. Eigentlich nur für Windows-Handles und für mit new oder new[] allokierte Speicherbreiche</p>
<p>Boost kenne ich nicht, wobei</p>
<pre><code class="language-cpp">boost::shared_ptr&lt; DEREF_SC_HANDLE&gt; hnd( getHandleIrgendwoher(), &amp;CloseServiceHandle );
</code></pre>
<p>mir schon zu lang ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<pre><code class="language-cpp">Safe&lt;SC_HANDLE&gt; Manager(getHandleIrgendwoher());
</code></pre>
<p>ist doch viel schöner?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991535</guid><dc:creator><![CDATA[Socker]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:43:23 GMT]]></title><description><![CDATA[<p>Socker schrieb:</p>
<blockquote>
<p>a. Versteh ich nicht?</p>
</blockquote>
<p>kurz: &quot;CSafe(void* val,const bool&amp; isarray)&quot; ist Overkill - für eingebaute Typen ist &quot;CSafe(void* val,bool isarray)&quot; praktischer.</p>
<p>@WinAPI-Handles: Da solltest du eventuell auf eine Bibliothek wie MFC umsteigen, damit hättest du für jeden Handle-Typ eine passende Wrapper-Klasse.<br />
(außerdem sind afaik die meisten HANDLE-Typen nur typedef's auf long, also kannst du deine CSafe-Klasse nicht getrennt für (z.B.) HWND und HDC spezialisieren)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991538</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:43:23 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 13:43:44 GMT]]></title><description><![CDATA[<p>nee, geht leider net. Bei der Treiberprogrammierung darf man das leider net <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/991540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991540</guid><dc:creator><![CDATA[Socker]]></dc:creator><pubDate>Sat, 11 Feb 2006 13:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 14:02:12 GMT]]></title><description><![CDATA[<p>Socker schrieb:</p>
<blockquote>
<p>SC_HANDLE ist von der WindowsTreiberProgrammierung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<blockquote>
<p>Davon abgesehen kann man keinen 'allgemeinen Smart-Pointer' für z.B. ein int anlegen.</p>
</blockquote>
<p>Wollte ich ja gar nicht. Eigentlich nur für Windows-Handles und für mit new oder new[] allokierte Speicherbreiche</p>
</blockquote>
<p>Klaro! hinter new steht doch immer ein Typ - z.B. int oder halt sowas wie MyClass. Und mit Deinem Code kannst Du kein</p>
<pre><code class="language-cpp">CSafe&lt; MyClass &gt; p( new MyClass ); // compiliert nicht
</code></pre>
<p>schreiben, da es keine allgemeine Implementierung gibt. Die Variante mit void* ist nicht typsicher und bringt Unsicherheiten.</p>
<p>Socker schrieb:</p>
<blockquote>
<p>Boost kenne ich nicht,</p>
</blockquote>
<p>was nicht ist, kann ja werden <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="😉"
    /> . C++ machen und boost nicht kennen ist - wie soll ich sagen - ist einfach indiskutabel; da fehlt einfach was.</p>
<p>Socker schrieb:</p>
<blockquote>
<p>wobei</p>
<pre><code class="language-cpp">boost::shared_ptr&lt; DEREF_SC_HANDLE&gt; hnd( getHandleIrgendwoher(), &amp;CloseServiceHandle );
</code></pre>
<p>mir schon zu lang ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>.. kürzer als Deine Klasse <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="😉"
    /></p>
<p>Gruß<br />
Weerner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991545</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 11 Feb 2006 14:02:12 GMT</pubDate></item><item><title><![CDATA[Reply to Smart Pointer on Sat, 11 Feb 2006 14:11:54 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a>:</p>
<pre><code class="language-cpp">class C
	{

	};
	CSafe&lt;C*&gt; T(new C);

//mit...

template&lt;class T&gt; class CSafe&lt;T*&gt; : public CSafeBase&lt;T*&gt;
{
private:
	bool				m_bArray;

public:
						CSafe(T* pType, const bool&amp; bArray=false) : CSafeBase(pType)
	{
		m_bArray=bArray;
	}

						~CSafe()
	{
		if(m_Type)
		{
			if(m_bArray)
			{
				delete[] m_Type;
			}
			else
			{
				delete m_Type;
			}
		}
	}
};
</code></pre>
<p>Anyway, boost werde ich mir dann mal zu Gemüte führen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/991554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991554</guid><dc:creator><![CDATA[Socker]]></dc:creator><pubDate>Sat, 11 Feb 2006 14:11:54 GMT</pubDate></item></channel></rss>