<?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 nicht vectorfähig?]]></title><description><![CDATA[<p>hi leute</p>
<p>ich hab folgendes problem<br />
ich hab einen vector voll boost::shared_pointer auf eine klasse<br />
ich fülle den vector mit quasi dem nullpendant der klasse<br />
danach wird der vector bei bedarf mit derivaten dieser klasse überschrieben (d.h. nur halt das element was gebraucht wird wird von base zu derive)</p>
<p>so nun hab ich halt ein element überschrieben, will bei einem anderen (einem der base elemente) eine methode ausführen, klappt auch<br />
dann möchte ich aber eine methode von dem derive ausführen und da hakts<br />
speicherzugriffsverletzungblabla</p>
<p>ist shared_pointer nicht dafür gebaut mit vererbung umzugehen?!? (kann ich mir nicht vorstellen)<br />
liegt das daran dass der vector intern was kopiert und sharedptr das nicht mag ?!?</p>
<p>beim debuggen jedenfalls hängt das genau in der zeile, die position im vector ist richtig (liegt also nichts ausserhalb der vector range), der zeiger von shared ptr ist richtig (da gehts auf jedenfall ohne probleme durch) und dann wenns zur methode gehen sollte krachts</p>
<p>mfg mosho</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273378/boost-shared_ptr-nicht-vectorfähig</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 05:12:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273378.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Sep 2010 11:26:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 11:26:26 GMT]]></title><description><![CDATA[<p>hi leute</p>
<p>ich hab folgendes problem<br />
ich hab einen vector voll boost::shared_pointer auf eine klasse<br />
ich fülle den vector mit quasi dem nullpendant der klasse<br />
danach wird der vector bei bedarf mit derivaten dieser klasse überschrieben (d.h. nur halt das element was gebraucht wird wird von base zu derive)</p>
<p>so nun hab ich halt ein element überschrieben, will bei einem anderen (einem der base elemente) eine methode ausführen, klappt auch<br />
dann möchte ich aber eine methode von dem derive ausführen und da hakts<br />
speicherzugriffsverletzungblabla</p>
<p>ist shared_pointer nicht dafür gebaut mit vererbung umzugehen?!? (kann ich mir nicht vorstellen)<br />
liegt das daran dass der vector intern was kopiert und sharedptr das nicht mag ?!?</p>
<p>beim debuggen jedenfalls hängt das genau in der zeile, die position im vector ist richtig (liegt also nichts ausserhalb der vector range), der zeiger von shared ptr ist richtig (da gehts auf jedenfall ohne probleme durch) und dann wenns zur methode gehen sollte krachts</p>
<p>mfg mosho</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948727</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 06 Sep 2010 11:26:26 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 11:48:38 GMT]]></title><description><![CDATA[<p>Es wäre besser, code statt umständlicher Worte zu posten.<br />
Eigentlich sollte das was du vorhast klappen. Wobei die <a href="http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html" rel="nofollow">boost ptr_container</a> wohl eher anzuraten sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948737</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 06 Sep 2010 11:48:38 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 12:14:10 GMT]]></title><description><![CDATA[<p>ok, ich versuch das mal zusammenzufassen</p>
<p>die benutzten klassen</p>
<pre><code class="language-cpp">class Base
{
public:
    virtual void init() { /* do what... */ }
    virtual void exit() { /* do what... */ }

protected:
    bool isInit;
};

class Derive : public Base
{
    void init()  { /* do what... */ }
    void exit() { /* do what... */ }
};
</code></pre>
<p>main</p>
<pre><code class="language-cpp">int main()
{
    std::vector&lt;boost::shared_ptr&lt;Base&gt;&gt; vec;
    vec.resize(2);
    for(int i = 0; i &lt; vec.size(); ++i)
        vec[i] = boost::shared_ptr&lt;Base&gt;(new Base);

    vec[0]-&gt;init();
    // tu was
    vec[0]-&gt;exit();

    vec[1] = shared_ptr&lt;Base&gt;(new Derive);
    vec[1]-&gt;init();   // Hier crashts, 1 ist innerhalb der vector range und der zeiger sollte gültig sein...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1948746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948746</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 06 Sep 2010 12:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 12:20:51 GMT]]></title><description><![CDATA[<p><em>boost::shared_dynamic_cast&lt;&gt;</em> <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/1948754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948754</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Mon, 06 Sep 2010 12:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 12:28:52 GMT]]></title><description><![CDATA[<p>bei mir &quot;crasht&quot; da nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948758</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Mon, 06 Sep 2010 12:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 12:53:16 GMT]]></title><description><![CDATA[<p>Kóyaánasqatsi schrieb:</p>
<blockquote>
<p><em>boost::shared_dynamic_cast&lt;&gt;</em> <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>Wozu? An seinem gezeigten Code sehe ich jedenfalls kein Grund dafür (Aber ebenso keinen Grund für einen Absturz).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948770</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 06 Sep 2010 12:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 13:34:31 GMT]]></title><description><![CDATA[<p>std::vector und boost::shared_ptr vertragen sich wunderbar.<br />
und boost::shared_ptr verträgt sich supi mit Vererbung.</p>
<p>Dein Problem liegt also vermutlich wo anders. Vielleicht versuchst du ja die Objekte auf die der boost::shared_ptr zeigt einfach nur zugeweisen, wodurch sie &quot;zerschnitten&quot; werden (slicing).</p>
<p>EDIT: übersehen. Nein, tust du nicht. Keine Ahnung wieso das nicht gehen sollte.</p>
<p>EDIT2: step doch einfach mal mit dem Debugger rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948781</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 06 Sep 2010 13:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 14:09:03 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Base
{
public:
    virtual void init() { /* do what... */ }
    virtual void exit() { /* do what... */ }

protected:
    bool isInit;
};

class Derive : public Base
{
    void init()  { /* do what... */ }
    void exit() { /* do what... */ }
};
</code></pre>
</blockquote>
<p>Wenn Du nach einer Übersetzung von &quot;Tu was&quot; suchst, dann würde das &quot;Do something&quot; heißen. <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>Ich bemerke, dass Base keinen virtuellen Destruktor hat.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int main()
{
    std::vector&lt;boost::shared_ptr&lt;Base&gt;&gt; vec;
    vec.resize(2);
    for(int i = 0; i &lt; vec.size(); ++i)
        vec[i] = boost::shared_ptr&lt;Base&gt;(new Base);

    vec[0]-&gt;init();
    // tu was
    vec[0]-&gt;exit();

    vec[1] = shared_ptr&lt;Base&gt;(new Derive);
    vec[1]-&gt;init();   // Hier crashts, 1 ist innerhalb der vector range und der zeiger sollte gültig sein...
}
</code></pre>
</blockquote>
<p>Zeile 3 des letzten Teils enthält ein &quot;&gt;&gt;&quot; was ein &quot;&gt; &gt;&quot; sein sollte, damit es auch andere Compiler im C++98-Modus fressen. Ohne das Leerzeichen ist das erst gültig ab C++0x, da es sonst als Verschiebe-Operator interpretiert wird.</p>
<p>Und<br />
<code>vec[1] = shared_ptr&lt;Base&gt;(new Derive);</code><br />
kann man auch kürzer schreiben:<br />
<code>vec[1].reset(new Derive);</code></p>
<p>Obwohl Base keinen virtuellen Destruktor hat, ist dies in diesem Fall ausnahmsweise legal. shared_ptr verwendet <code>template</code> isierte Konstruktoren und reset-Funktionen, so dass der Zeigertyp <code>Derived*</code> erkannt wird. Folgendes funktioniert aber schon nicht mehr richtig (undefined behaviour)<br />
`</p>
<p>Base* ptr = new Derive;</p>
<p>vec[1].reset(ptr);</p>
<p>`<br />
da ptr vom Typ Base* ist, Base keinen virtuellen Destruktor hat und daher shared_ptr nicht den richtigen Destruktor aufrufen kann. Also, wenn Du Objekte polymorpher Klassen dynamisch anlegen und löschen willst, sollte der Destruktor der Basisklasse virtuell sein.</p>
<p>Sonst gibt es nicht viel auszusetzen. Du musst irgendwas anderes falsch gemacht haben; denn das <a href="http://codepad.org/YI4Un5Bf" rel="nofollow">Programm ist kompilierbar und lauffähig</a>.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948815</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 06 Sep 2010 14:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 19:38:41 GMT]]></title><description><![CDATA[<p>folgendes hab ich verändert</p>
<pre><code class="language-cpp">int main()
{
    std::vector&lt;boost::shared_ptr&lt;Base&gt;&gt; vec;
    vec.resize(2);
    for(int i = 0; i &lt; vec.size(); ++i)
        vec[i] = boost::shared_ptr&lt;Base&gt;(new Base);

    vec[0]-&gt;init();
    // tu was
    vec[0]-&gt;exit();

    Base * d = new Derive;
    vec[1].reset(d);       // hab reset anstelle dem alten verwendet
    vec[1]-&gt;init();   // crasht
}
</code></pre>
<p>achja, und ich hatte die ganze zeit nen virtuellen Dtor<br />
hab den nur net hier reingeschrieben gehabt...</p>
<p>klappen tuts nicht<br />
(( vorm edit dachte ich hätts geklappt, war aber an der falschen stelle ))</p>
<p>klappt immer noch net...<br />
mh die speicheraddresse ist 0x00000004<br />
also eig die zweite int adresse im ram wenn ich das richtig sehe ?!?</p>
<p>mh ich hab keinen plan warums net geht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948958</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 06 Sep 2010 19:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 20:26:05 GMT]]></title><description><![CDATA[<blockquote>
<p>achja, und ich hatte die ganze zeit nen virtuellen Dtor<br />
hab den nur net hier reingeschrieben gehabt...</p>
</blockquote>
<p>Wie willst du den Fehler finden, wenn du nie den original Code postest?</p>
<p>Mal abgesehen davon dass du damit die Zeit anderer Foren-Teilnehmer verschwendest, und das IMO recht unhöflich ist, wirst du auch kaum eine brauchbare Antwort bekommen, wenn du immer irgendwie abgeänderten und/oder unvollständigen Code postest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1948992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1948992</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 06 Sep 2010 20:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 20:46:07 GMT]]></title><description><![CDATA[<p>der original code beläuft sich auf recht viele zeilen, den wollt ihr hier doch auch nicht oder?!?</p>
<p>ich hab den fehler...</p>
<p>ich hab in einigen construtoren ZeroMemory<br />
und das verträgt sich wohl voll nicht mit gewissen sachen</p>
<p>hab das jetzt rausgemacht und jetzt klappts</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949009</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 06 Sep 2010 20:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 21:00:04 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>der original code beläuft sich auf recht viele zeilen, den wollt ihr hier doch auch nicht oder?!?</p>
</blockquote>
<p>Nein, aber man kann erwarten dass der Fragesteller versucht, das Problem so weit einzugrenzen, dass es nicht mehr so viel Code ist. Idealerweise hat er mit dem Debugger &amp;Co einzelne Stellen gefunden, bei denen das Problem auftritt. Dann kann er diesen Bereich posten. Dabei sollte aber der Fehler auftreten, was bei dir nicht der Fall war!</p>
<blockquote>
<p>ich hab in einigen construtoren ZeroMemory</p>
</blockquote>
<p>Und du weißt was ZeroMemory macht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949016</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 06 Sep 2010 21:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Mon, 06 Sep 2010 21:07:25 GMT]]></title><description><![CDATA[<p>aber ich hab doch den debugger benutzt und auch die ergebnisse geschrieben</p>
<p>ja zeromemory füllt auf assembler ebene (also recht low level) die gesamte grösse der angegeben struktur mit null(en)</p>
<p>hab dabei nur nicht bedacht dass manche sachen einfach werte brauchen</p>
<p>werden dabei eigentlich auch constanten zurückgesetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949017</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 06 Sep 2010 21:07:25 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr nicht vectorfähig? on Tue, 07 Sep 2010 01:38:08 GMT]]></title><description><![CDATA[<p>Poste ein <strong>kurzes</strong> aber <strong>vollständiges, kompilierbares</strong> Beispiel, welches das Problem enthält. Das erfordert ein Isolieren, Kürzen und Testen Deinerseits. Pseudo-Code runter tippen, von dem Du nur glaubst, dass er den Fehler enthält, führt zu nichts.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>ja zeromemory füllt auf assembler ebene (also recht low level) die gesamte grösse der angegeben struktur mit null(en)</p>
<p>hab dabei nur nicht bedacht dass manche sachen einfach werte brauchen</p>
<p>werden dabei eigentlich auch constanten zurückgesetzt?</p>
</blockquote>
<p>Das klingt schon mal sehr nach undefiniertem Verhalten. Aber was Du da genau machst, wissen wir noch nicht, weil Du es nicht gezeigt hast.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1949054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1949054</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 07 Sep 2010 01:38:08 GMT</pubDate></item></channel></rss>