<?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[Adresse des internen pointers von unique_ptr]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte eine Funktion einer C Api benutzen. Als Argument wird die Addresse eines pointers erwartet. Normalerweise wird die Funktion so aufgerufen:</p>
<pre><code>some_type * x;

function(&amp;x);
</code></pre>
<p>Ich habe jetzt einen unique_ptr, der mein x verwaltet:</p>
<pre><code>std::unique_ptr&lt;some_type, decltype(&amp;my_deleter)&gt; ptr(x, my_deleter);
</code></pre>
<p>Wenn ich jetzt versuche, die Funktion aufzurufen, gibt es einen Fehler:</p>
<pre><code>function(&amp;ptr.get())
//Fehler: Addressoperator auf R-Value angewendet
</code></pre>
<p>Das klingt eigentlich nach einem Standardproblem. Gibt es eine Möglichkeit, das als Einzeiler zu lösen? Direkt an den Internen Pointer kommt man ja nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337223/adresse-des-internen-pointers-von-unique_ptr</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 08:25:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337223.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Mar 2016 00:05:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 00:05:27 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte eine Funktion einer C Api benutzen. Als Argument wird die Addresse eines pointers erwartet. Normalerweise wird die Funktion so aufgerufen:</p>
<pre><code>some_type * x;

function(&amp;x);
</code></pre>
<p>Ich habe jetzt einen unique_ptr, der mein x verwaltet:</p>
<pre><code>std::unique_ptr&lt;some_type, decltype(&amp;my_deleter)&gt; ptr(x, my_deleter);
</code></pre>
<p>Wenn ich jetzt versuche, die Funktion aufzurufen, gibt es einen Fehler:</p>
<pre><code>function(&amp;ptr.get())
//Fehler: Addressoperator auf R-Value angewendet
</code></pre>
<p>Das klingt eigentlich nach einem Standardproblem. Gibt es eine Möglichkeit, das als Einzeiler zu lösen? Direkt an den Internen Pointer kommt man ja nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490649</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Thu, 17 Mar 2016 00:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 00:09:55 GMT]]></title><description><![CDATA[<p>Wenn die C-Funktion die Adresse des Pointers möchte, wird das doch sicherlich den Grund haben, dass sie diesen Wert ändern möchte. In dem Fall wäre ein unique_ptr nicht geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490650</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 17 Mar 2016 00:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 00:11:48 GMT]]></title><description><![CDATA[<p>Gutes Argument. Dann halt ohne unique pointer <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/2490651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490651</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Thu, 17 Mar 2016 00:11:48 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 00:22:33 GMT]]></title><description><![CDATA[<p>asdfasd schrieb:</p>
<blockquote>
<p>Gutes Argument. Dann halt ohne unique pointer <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>Und guck dir unbedingt an, was die Funktion überhaupt genau macht. Klingt so, als wäre dir das im Moment selbst nicht so ganz klar.</p>
<p>Ist das eine Art Konstruktor, der dir ein Handle zurück gibt, das du dann in dem unique_ptr speichern möchtest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490653</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 17 Mar 2016 00:22:33 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 00:57:29 GMT]]></title><description><![CDATA[<p>Ist nur eine Übungsaufgabe für die Uni. Den Quellcode der Funktion habe ich nicht, aber laut Dokumentation ändert die Funktion den Pointer nicht, von daher wäre es wahrscheinlich OK. Trotzdem hast du natürlich recht, dem unique_ptr potentiell die Kontrolle über seine Ressource zu nehmen, ist nicht gut. Aufgabe ist, den pointer als Member einer C++-Klasse zu machen und mit einem C-Interface zu interagieren. Der ganze Kontext sieht ungefähr so aus:</p>
<pre><code>//C Api
void do_something(some_type **);

some_type* allocate_some_type(args...);

void delete_some_type(some_type*);

//C++ part - so wollte ich es machen
class Class
{
public:
    unique_ptr&lt;some_type, decltype(&amp;delete_some_type)&gt; ptr;

    Class(args)
        : ptr(allocate_some_type(args), delete_some_type)
    {}
};

// irgendwann speater im code:
Class c(args);
do_sutff( &amp;c.ptr.get() );

// C++ part - so mache ich es jetzt
class Class
{
public:
    some_type* ptr;

    Class(args)
        : ptr(allocate_some_type(args))
    {}
    // freigabe der ressource im Destruktor anstatt ueber unique_ptr
    ~Class() { delete_some_type(ptr); }
}

// irgendwann speater im code:
Class c(args);
do_sutff( &amp;c.ptr );
</code></pre>
<p>Ich denke das wird der Aufgabe so gerechet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490656</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Thu, 17 Mar 2016 00:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 01:11:31 GMT]]></title><description><![CDATA[<p>Komische Schnittstelle. Das mit dem allocate_some_type und dem delete_some_type ist, wie ich es mir vorgestellt habe. Das do_something fällt dann plötzlich aus der Reihe.</p>
<p>Das do_stuff soll doch sicherlich ein Member der Class sein.</p>
<p>Denk bei deiner Lösung ohne unique_ptr an die Regel der großen Drei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490657</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 17 Mar 2016 01:11:31 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 02:28:54 GMT]]></title><description><![CDATA[<p>&quot;do_something&quot; schreibt in meinem Fall einfach ein paar Informationen über &quot;some_type&quot; in die Konsole (wie gesagt, auf die Definition von &quot;do_something&quot; habe ich keinen Einfluss). Ich kann natürlich eine Art Wrapper dafür in die Klasse bauen:</p>
<pre><code>class Class
{
    some_type* ptr = nullptr;

public:
    Class(args)
        : ptr(allocate_some_type(args))
    {}

    // der &quot;Wrapper&quot;
    void print() { do_something(&amp;ptr); }

    // freigabe der ressource im Destruktor anstatt ueber unique_ptr
    ~Class()
    {
        if(ptr)
            delete_some_type(ptr);
    }

    // ist nur eine Uebung. Regel der grossen drei/fuenf nicht wichtig :D
    Class&amp; operator=(const Class&amp;) = delete;
    Class&amp; operator=(Class&amp;&amp;) = delete;
    Class(const Class&amp;) = delete;
    Class(Class&amp;&amp;) = delete;
}

// irgendwann speater im code:
Class c(args);
c.print();
</code></pre>
<p>Meinst du so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490658</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Thu, 17 Mar 2016 02:28:54 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 03:02:23 GMT]]></title><description><![CDATA[<p>Ja. Ich kenne natürlich nicht die genaue Aufgabenstellung, aber von</p>
<blockquote>
<p>Aufgabe ist, den pointer als Member einer C++-Klasse zu machen und mit einem C-Interface zu interagieren.</p>
</blockquote>
<p>her würde ich annehmen, dass das so gemeint ist.</p>
<p>PS: Die Regel der großem Drei/Fünf ist <em>immer</em> wichtig, wenn du Ressourcen verwaltest. Das Kopieren zu verbieten, wie du es hier machst, kann eine richtige und sinnvolle Anwendung der Regel sein. Jedenfalls ist es sehr wichtig, dass dein Code die Problematik irgendwie handhabt, sonst kommst du ganz schnell in Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490659</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 17 Mar 2016 03:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse des internen pointers von unique_ptr on Thu, 17 Mar 2016 03:07:28 GMT]]></title><description><![CDATA[<p>Ok, ich denke die Lösung ist so in Ordnung. Danke für deine Tipps!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490660</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Thu, 17 Mar 2016 03:07:28 GMT</pubDate></item></channel></rss>