<?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[delete mit Größenangabe?]]></title><description><![CDATA[<p>Hallo,<br />
ich will eine Art mehr oder weniger dynamische Möglichkeit bieten, Parameter verschiedenster Typen an eine Funktion zu übergeben. Dann soll nach Ablauf einer bestimmten Zeit eine Funktion aufgerufen werden, d.h. die Parameter müssen zwischengespeichert werden. Das ganze klappt ja so lange ganz gut, wie ich weiß, welchen Typ die Parameter haben. Aber was ist, wenn ich eine Möglichkeit bieten will, auch Typen zu supporten, die ich zur Compilezeit gar nicht kenne? Idee: Man übergibt einen Pointer, der per <code>new</code> erstellt wurde und die Größe des Objekts. Nun möchte ich, wenn die Zeit um ist und eine bestimmte Funktion aufgerufen wurde, das unbekannte Objekt wieder löschen. Problem: der Compiler kennt die Größe des Typs ja nicht.</p>
<p>Zentrale Frage: Wie sage ich <code>delete</code> , dass es ab der Stelle X, also ab da, wo der Typ mit <code>new</code> erstellt wurde, die Anzahl an Bytes löscht, die mir übergeben wurden?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278133/delete-mit-größenangabe</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 13:43:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278133.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Nov 2010 19:13:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to delete mit Größenangabe? on Tue, 30 Nov 2010 19:13:47 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich will eine Art mehr oder weniger dynamische Möglichkeit bieten, Parameter verschiedenster Typen an eine Funktion zu übergeben. Dann soll nach Ablauf einer bestimmten Zeit eine Funktion aufgerufen werden, d.h. die Parameter müssen zwischengespeichert werden. Das ganze klappt ja so lange ganz gut, wie ich weiß, welchen Typ die Parameter haben. Aber was ist, wenn ich eine Möglichkeit bieten will, auch Typen zu supporten, die ich zur Compilezeit gar nicht kenne? Idee: Man übergibt einen Pointer, der per <code>new</code> erstellt wurde und die Größe des Objekts. Nun möchte ich, wenn die Zeit um ist und eine bestimmte Funktion aufgerufen wurde, das unbekannte Objekt wieder löschen. Problem: der Compiler kennt die Größe des Typs ja nicht.</p>
<p>Zentrale Frage: Wie sage ich <code>delete</code> , dass es ab der Stelle X, also ab da, wo der Typ mit <code>new</code> erstellt wurde, die Anzahl an Bytes löscht, die mir übergeben wurden?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988173</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Tue, 30 Nov 2010 19:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Tue, 30 Nov 2010 19:40:11 GMT]]></title><description><![CDATA[<p>Was soll die Grösse bringen? Du kannst ja nicht einfach ein Objekt per memcpy() kopieren...</p>
<p>Guck dir mal <code>boost::any</code> an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988185</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Nov 2010 19:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Tue, 30 Nov 2010 19:48:36 GMT]]></title><description><![CDATA[<p>Sowas geht entweder mit Templates (dann kannst wird auch der Destruktor aufgerufen) oder mit malloc/free (hier wird die Grösse mitgeschrieben.</p>
<p>Zweiteres würde ich dir nicht empfehlen, daher:</p>
<pre><code class="language-cpp">// Header:
void my_ugly_pointer_func_do(void *ptr);

// Nur dieser Teil ist templated, da sonst jedesmal die obere Funktion neu geschrieben werden muss
template&lt;typename T&gt;
void my_ugly_pointer_func(T *ptr)
{
  my_ugly_pointer_func_do(ptr);
  delete ptr; // Destruktor wird aufgerufen, Compiler weiss von welchem Typ (wenn kein Array).
}

// Code:
void my_ugly_pointer_func_do(void *ptr)
{
   // hier dein alter Code
}
</code></pre>
<p>So sollte das gehen, mir will der Sinn aber nicht ganz erschliessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988187</guid><dc:creator><![CDATA[délévoid]]></dc:creator><pubDate>Tue, 30 Nov 2010 19:48:36 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Wed, 01 Dec 2010 07:55:57 GMT]]></title><description><![CDATA[<p>@ hustbaer: Das habe ich auch gar nicht vor. Ich habe mir das so vorgestellt:</p>
<pre><code class="language-cpp">// externe plugin.dll
class Bla // Bla ist nur in plugin.dll bekannt, somit auch dessen Größe
{
public:
    // ...
};

// ...

void myCallback(void **)
{
}

// ...

bool *test = new bool;
*bool = false;
int *x = new int;
*x = 2;
Bla *bla = new Bla;

pMyIface-&gt;CreateTimer(2.0/*delay*/, myCallback, Type_Bool, test, Type_Int, x, Type_AutoDeletePointer, bla);

// ...

typedef void (*Callback_t)(void **);

void MyIface::CreateTimer(double delay, Callback_t Callback, ...)
{
    // daten speichern
}

void MyIface::OnTick()
{
    for (/* daten durchlaufen*/)
    {
        if (bla.delay + currenttime &lt;= currenttime)
        {
            bla.callback(bla.params);

            // an dieser stelle müsste ich dann alle parameter durchgehen, um diese mit delete wieder zu löschen
            // bei bool, int, float, double, long, und so, weiß ich ja, wie groß sie sind, d.H. ich kann folgendes machen:
            delete (long*)blub;
            // bei eigenen Typen weiß der Compiler ja nicht, wie groß diese sind
            // also bräuchte ich etwas, was dem delete folgendes sagt:
            // ab hier z.B. 250 bytes löschen
            delete (void*)blub;
        }
    }
}
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988326</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 01 Dec 2010 07:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Wed, 01 Dec 2010 08:16:08 GMT]]></title><description><![CDATA[<p>Eigentlich müsste deine Speicherverwaltung selber die allokierte Größe kennen. Wenn ich <code>delete [] foo;</code> schreibe teile ich ja auch nicht dem Compiler die Anzahl der Elemente mit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988332</guid><dc:creator><![CDATA[Nick Unbekannt]]></dc:creator><pubDate>Wed, 01 Dec 2010 08:16:08 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Wed, 01 Dec 2010 08:37:12 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>ich will eine Art mehr oder weniger dynamische Möglichkeit bieten, Parameter verschiedenster Typen an eine Funktion zu übergeben. Dann soll nach Ablauf einer bestimmten Zeit eine Funktion aufgerufen werden, d.h. die Parameter müssen zwischengespeichert werden.</p>
</blockquote>
<p>Das klingt nach dem, was boost::thread auch schon macht. Der Konstruktor nimmt ein beliebiges Funktionsobjekt optional mit zusätzlichen Parametern entgegen und speichert diese zwischen, so dass der neu gestartete Thread darauf später arbeiten kann. boost::function und boost::any arbeiten ähnlich. Der Trick heißt &quot;type erasure&quot; in C++. In Java gibt es diesen Begriff auch, hat dort aber eine leicht andere Bedeutung. Ich bin mir auch sicher, dass das in diesem Forum mindestens 2mal schon erklärt wurde. Such mal danach. <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/1988340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988340</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 01 Dec 2010 08:37:12 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Wed, 01 Dec 2010 13:56:40 GMT]]></title><description><![CDATA[<p>Zum Löschen reicht es doch nicht wenn du die Grösse kennst, es muss ja u.U. auch ein Destruktor laufen.<br />
Verwende doch einfach ein Interface ala so:</p>
<pre><code class="language-cpp">class TimerCallback
{
public:
    virtual ~TimerCallback() {}
    virtual void OnTick() = 0; // braucht keine parameter!
};

void Foo::CreateTimer(double delay, TimerCallback* callback)
{
    // ...
}

void Foo::OnTick()
{
    // ...
    callback-&gt;OnTick();
    delete callback; // löscht callback inklusive aller parameter
    // ...
}

// Benutzung:

class MyTimerCallback : public TimerCallback
{
public:
    MyTimerCallback(int a, int b, int c)
        : m_a(a), m_b(b), m_c(c)
    {
    }

    virtual void OnTick()
    {
        printf(&quot;%d, %d, %d\n&quot;, m_a, m_b, m_c);
    }
private:
    int m_a;
    int m_b;
    int m_c;
};

void Test()
{
    MyTimerCallback* callback = new MyTimerCallback(1, 2, 3);
    foo-&gt;CreateTimer(42, callback);
}
</code></pre>
<p>Oder verwende gleich boost::function statt <code>TimerCallback</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988546</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 01 Dec 2010 13:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to delete mit Größenangabe? on Wed, 01 Dec 2010 15:15:13 GMT]]></title><description><![CDATA[<p>Ich muss schon sagen: Die Idee ist genial!<br />
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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988589</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Wed, 01 Dec 2010 15:15:13 GMT</pubDate></item></channel></rss>