<?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[boost::shared_ptr kommt nicht mit unvollständigem Typ pcap_t zurecht]]></title><description><![CDATA[<p>Ich benutze die pcap-Library und in dieser wird die pcap_t* Struktur nur mit forward declaration erstellt. Aber ich möchte gerne trotzdem einen SmartPointer zur verwalten nehmen. Wie lässt sich das lösen?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/shared_ptr.hpp&gt;
#include &lt;pcap.h&gt;

void PcapClose(pcap_t* h)
{
	if(h)
	{
		pcap_close(h);
	}
}

boost::shared_ptr&lt;pcap_t&gt; handle((pcap_t*)0, PcapClose);

int main()
{
	handle.reset((pcap_t*)0); // In Wirklich wird natürlich mit einem richtigen Wert initialisiert
}
</code></pre>
<pre><code>/usr/include/boost/checked_delete.hpp: In function »void boost::checked_delete(T*) [with T = pcap_t]«:
/usr/include/boost/detail/shared_count.hpp:86:   instantiated from »boost::detail::shared_count::shared_count(Y*) [with Y = pcap_t]«
/usr/include/boost/shared_ptr.hpp:124:   instantiated from »boost::shared_ptr&lt;T&gt;::shared_ptr(Y*) [with Y = pcap_t, T = pcap]«
/usr/include/boost/shared_ptr.hpp:237:   instantiated from »void boost::shared_ptr&lt;T&gt;::reset(Y*) [with Y = pcap_t, T = pcap]«
test2.cpp:16:   instantiated from here
/usr/include/boost/checked_delete.hpp:32: Fehler: Ungültige Anwendung von »sizeof« auf unvollständigen Typen »pcap_t« 
/usr/include/boost/checked_delete.hpp:32: Fehler: Feld negativer Größe (»-0x00000000000000001«) wird erzeugt
/usr/include/boost/checked_delete.hpp:33: Fehler: Ungültige Anwendung von »sizeof« auf unvollständigen Typen »pcap_t« 
/usr/include/boost/checked_delete.hpp:33: Fehler: Feld negativer Größe (»-0x00000000000000001«) wird erzeugt
/usr/include/boost/checked_delete.hpp:34: Warnung: mögliches Problem bei Aufruf des »delete«-Operators erkannt
/usr/include/boost/checked_delete.hpp:29: Warnung: »x« has incomplete type
/usr/include/pcap.h:65: Warnung: forward declaration of »struct pcap«
/usr/include/boost/checked_delete.hpp:34: Anmerkung: weder der Destruktor noch der klassenspezifische Operator »delete« wird aufgerufen,
auch wenn sie bei der Klassendefinition deklariert werden
</code></pre>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177942/boost-shared_ptr-kommt-nicht-mit-unvollständigem-typ-pcap_t-zurecht</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:48:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177942.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Apr 2007 14:42:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::shared_ptr kommt nicht mit unvollständigem Typ pcap_t zurecht on Thu, 05 Apr 2007 14:42:03 GMT]]></title><description><![CDATA[<p>Ich benutze die pcap-Library und in dieser wird die pcap_t* Struktur nur mit forward declaration erstellt. Aber ich möchte gerne trotzdem einen SmartPointer zur verwalten nehmen. Wie lässt sich das lösen?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;boost/shared_ptr.hpp&gt;
#include &lt;pcap.h&gt;

void PcapClose(pcap_t* h)
{
	if(h)
	{
		pcap_close(h);
	}
}

boost::shared_ptr&lt;pcap_t&gt; handle((pcap_t*)0, PcapClose);

int main()
{
	handle.reset((pcap_t*)0); // In Wirklich wird natürlich mit einem richtigen Wert initialisiert
}
</code></pre>
<pre><code>/usr/include/boost/checked_delete.hpp: In function »void boost::checked_delete(T*) [with T = pcap_t]«:
/usr/include/boost/detail/shared_count.hpp:86:   instantiated from »boost::detail::shared_count::shared_count(Y*) [with Y = pcap_t]«
/usr/include/boost/shared_ptr.hpp:124:   instantiated from »boost::shared_ptr&lt;T&gt;::shared_ptr(Y*) [with Y = pcap_t, T = pcap]«
/usr/include/boost/shared_ptr.hpp:237:   instantiated from »void boost::shared_ptr&lt;T&gt;::reset(Y*) [with Y = pcap_t, T = pcap]«
test2.cpp:16:   instantiated from here
/usr/include/boost/checked_delete.hpp:32: Fehler: Ungültige Anwendung von »sizeof« auf unvollständigen Typen »pcap_t« 
/usr/include/boost/checked_delete.hpp:32: Fehler: Feld negativer Größe (»-0x00000000000000001«) wird erzeugt
/usr/include/boost/checked_delete.hpp:33: Fehler: Ungültige Anwendung von »sizeof« auf unvollständigen Typen »pcap_t« 
/usr/include/boost/checked_delete.hpp:33: Fehler: Feld negativer Größe (»-0x00000000000000001«) wird erzeugt
/usr/include/boost/checked_delete.hpp:34: Warnung: mögliches Problem bei Aufruf des »delete«-Operators erkannt
/usr/include/boost/checked_delete.hpp:29: Warnung: »x« has incomplete type
/usr/include/pcap.h:65: Warnung: forward declaration of »struct pcap«
/usr/include/boost/checked_delete.hpp:34: Anmerkung: weder der Destruktor noch der klassenspezifische Operator »delete« wird aufgerufen,
auch wenn sie bei der Klassendefinition deklariert werden
</code></pre>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260187</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Thu, 05 Apr 2007 14:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kommt nicht mit unvollständigem Typ pcap_t zurecht on Thu, 05 Apr 2007 16:29:08 GMT]]></title><description><![CDATA[<p>Dann mach doch einen vollständigen Typ draus (shared_ptr benötigt vermutlich irgendwo im Inneren die Größe des Zieltyps).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260260</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 05 Apr 2007 16:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr kommt nicht mit unvollständigem Typ pcap_t zurecht on Thu, 05 Apr 2007 18:28:51 GMT]]></title><description><![CDATA[<p>Der normale Deleter eines shared_ptr&lt;T&gt; benutzt delete p. Zwar muss dafür T an sich nicht vollständig sein, allerdings führt dies zu undefiniertem Verhalten, wenn T keinen trivialen Destruktor hat oder operator delete überlädt (ok, in letzterem Falle ist es nicht undefiniert, nur unerwünscht). Aus diesem Grunde existiert boost::checked_delete - der darin enthaltene sizeof-Ausdruck dient lediglich dazu, sicherzustellen, dass T ein vollständiger Typ ist und sonst einen Fehler beim Compilieren zu produzieren. Du kannst shared_ptr mit unvollständigem pcap_t verwenden, musst dabei aber peinlich darauf achten, stets deinen eigenen Deleter mitzugeben. Das ist hier nicht der Fall; auch reset verändert den Deleter<br />
also</p>
<pre><code class="language-cpp">int main()
{
    handle.reset((pcap_t*)0, PcapClose);
}
</code></pre>
<p>sollte das gewünschte Ergebnis produzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260336</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 05 Apr 2007 18:28:51 GMT</pubDate></item></channel></rss>