<?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[Der unique_ptr&amp;lt;&amp;gt; gibt mir nen Segfault...]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich habe einen unique_ptr&lt;&gt; auf SDL.Mix_Music, weil ich jedes Mal die Sample Rate neu setzen will. Jedes Mal, wenn man bei meiner Klasse (music) die open()-Methode aufruft, wird die SDL neu initialisiert (mit dem Wert der Sample Rate) und auch der unique_ptr&lt;Mix_Music, music_deleter&gt; wird resettet, mit Mix_LoadMUS.</p>
<p>Sobald ich aber zum zweiten Mal open() aufrufe, geht mir das Programm durch die Lappen und ich habe keine Ahnung, warum das so sein könnte.</p>
<pre><code class="language-cpp">class music{
        struct music_deleter{
            void operator()(Mix_Music* music){
                Mix_FreeMusic(music);
            }
        };

        std::unique_ptr&lt;Mix_Music, music_deleter&gt; music_handle;
        std::unique_ptr&lt;detail::music_initializer&gt; initializer;

    public:
...
        void open(const std::string&amp; file_path){
            initializer.reset(new detail::music_initializer(file_path.c_str()));
            music_handle.reset(Mix_LoadMUS(file_path.c_str()));

            if(!music_handle)
                throw std::runtime_error{Mix_GetError()};
        }
...
};
</code></pre>
<p>Wenn ich den Fehler debugge, zeigt er mir Zeile 4, in den Deleter von music_handle. Aber das kann doch nicht sein! Ich benutze ja schließlich einen unique_ptr&lt;&gt;, sogar mit speziellem Deleter. Wie man in Zeile 17 bis 18 erkennt, prüfe ich auch nach, ob das reset()en auch wirklich geklappt hat, und tatsächlich, es klappt jedes Mal, da keine Exception geworfen wird.</p>
<p>Der Stacktrace sieht für mich auch nicht falsch aus. Es wird open() aufgerufen -&gt; es wird unique_ptr&lt;&gt;::reset() aufgerufen -&gt; es wird der Deleter aufgerufen -&gt; es wird Mix_FreeMusic aufgerufen. Für mich sieht die Reihenfolge korrekt aus.</p>
<p>Folgender Stacktraceauszug:</p>
<pre><code>1  MPEG::Stop()                                                                                                                                                                                       0x7fffbd96b67b 
2  ??                                                                                                                                                                                                 0x7ffff788726d 
3  Mix_FreeMusic                                                                                                                                                                                      0x7ffff788823b 
4  sdl::music::music_deleter::operator()                                                                                                                                music.hpp                 53  0x40ccf9       
5  std::unique_ptr&lt;_Mix_Music, sdl::music::music_deleter&gt;::reset                                                                                                        unique_ptr.h              344 0x41ae1c       
6  sdl::music::open                                                                                                                                                     music.hpp                 69  0x4165e4       
7  main_window::play                                                                                                                                                    main_window.cpp           188 0x413677       
8  main_window::play                                                                                                                                                    main_window.cpp           203 0x41249a
</code></pre>
<p>Es geht übrigens um mp3-Dateien (ja, die sind ein Muss für einen Music Player).</p>
<p>Und ich bin jetzt mit meinen Debugging-Kräften am Ende und wollte hier mal nachfragen, ob da einer weiß, was ich falsch mach?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339934/der-unique_ptr-lt-gt-gibt-mir-nen-segfault</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 16:54:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339934.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Oct 2016 10:00:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Der unique_ptr&amp;lt;&amp;gt; gibt mir nen Segfault... on Sun, 09 Oct 2016 10:00:14 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich habe einen unique_ptr&lt;&gt; auf SDL.Mix_Music, weil ich jedes Mal die Sample Rate neu setzen will. Jedes Mal, wenn man bei meiner Klasse (music) die open()-Methode aufruft, wird die SDL neu initialisiert (mit dem Wert der Sample Rate) und auch der unique_ptr&lt;Mix_Music, music_deleter&gt; wird resettet, mit Mix_LoadMUS.</p>
<p>Sobald ich aber zum zweiten Mal open() aufrufe, geht mir das Programm durch die Lappen und ich habe keine Ahnung, warum das so sein könnte.</p>
<pre><code class="language-cpp">class music{
        struct music_deleter{
            void operator()(Mix_Music* music){
                Mix_FreeMusic(music);
            }
        };

        std::unique_ptr&lt;Mix_Music, music_deleter&gt; music_handle;
        std::unique_ptr&lt;detail::music_initializer&gt; initializer;

    public:
...
        void open(const std::string&amp; file_path){
            initializer.reset(new detail::music_initializer(file_path.c_str()));
            music_handle.reset(Mix_LoadMUS(file_path.c_str()));

            if(!music_handle)
                throw std::runtime_error{Mix_GetError()};
        }
...
};
</code></pre>
<p>Wenn ich den Fehler debugge, zeigt er mir Zeile 4, in den Deleter von music_handle. Aber das kann doch nicht sein! Ich benutze ja schließlich einen unique_ptr&lt;&gt;, sogar mit speziellem Deleter. Wie man in Zeile 17 bis 18 erkennt, prüfe ich auch nach, ob das reset()en auch wirklich geklappt hat, und tatsächlich, es klappt jedes Mal, da keine Exception geworfen wird.</p>
<p>Der Stacktrace sieht für mich auch nicht falsch aus. Es wird open() aufgerufen -&gt; es wird unique_ptr&lt;&gt;::reset() aufgerufen -&gt; es wird der Deleter aufgerufen -&gt; es wird Mix_FreeMusic aufgerufen. Für mich sieht die Reihenfolge korrekt aus.</p>
<p>Folgender Stacktraceauszug:</p>
<pre><code>1  MPEG::Stop()                                                                                                                                                                                       0x7fffbd96b67b 
2  ??                                                                                                                                                                                                 0x7ffff788726d 
3  Mix_FreeMusic                                                                                                                                                                                      0x7ffff788823b 
4  sdl::music::music_deleter::operator()                                                                                                                                music.hpp                 53  0x40ccf9       
5  std::unique_ptr&lt;_Mix_Music, sdl::music::music_deleter&gt;::reset                                                                                                        unique_ptr.h              344 0x41ae1c       
6  sdl::music::open                                                                                                                                                     music.hpp                 69  0x4165e4       
7  main_window::play                                                                                                                                                    main_window.cpp           188 0x413677       
8  main_window::play                                                                                                                                                    main_window.cpp           203 0x41249a
</code></pre>
<p>Es geht übrigens um mp3-Dateien (ja, die sind ein Muss für einen Music Player).</p>
<p>Und ich bin jetzt mit meinen Debugging-Kräften am Ende und wollte hier mal nachfragen, ob da einer weiß, was ich falsch mach?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511022</guid><dc:creator><![CDATA[Kellerbewohner]]></dc:creator><pubDate>Sun, 09 Oct 2016 10:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to Der unique_ptr&amp;lt;&amp;gt; gibt mir nen Segfault... on Sun, 09 Oct 2016 10:19:55 GMT]]></title><description><![CDATA[<p>Kellerbewohner schrieb:</p>
<blockquote>
<p>Jedes Mal, wenn man bei meiner Klasse (music) die open()-Methode aufruft, wird die SDL neu initialisiert</p>
</blockquote>
<p>Wenn Du die &quot;SDL neu initialisiert&quot; hast, darfst Du dann noch mit den alten Zeigern hantieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511023</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sun, 09 Oct 2016 10:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to Der unique_ptr&amp;lt;&amp;gt; gibt mir nen Segfault... on Sun, 09 Oct 2016 11:01:16 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Wenn Du die &quot;SDL neu initialisiert&quot; hast, darfst Du dann noch mit den alten Zeigern hantieren?</p>
</blockquote>
<p>Wow, danke!</p>
<pre><code class="language-cpp">music_handle.reset();
            initializer.reset(new detail::music_initializer(file_path.c_str()));
            music_handle.reset(Mix_LoadMUS(file_path.c_str()));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2511024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511024</guid><dc:creator><![CDATA[Kellerbewohner]]></dc:creator><pubDate>Sun, 09 Oct 2016 11:01:16 GMT</pubDate></item></channel></rss>