<?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[new überschreiben]]></title><description><![CDATA[<p>Ich möchte den operator new überladen, um eine zusätzliche Variable a zu übergeben.<br />
Es soll eine Klasse ZZZ erzeugt werden:</p>
<pre><code class="language-cpp">struct ZZZ : public zzz {...};
</code></pre>
<p>Der überladene Operator kennt die Basisklasse zzz, nicht aber ZZZ.</p>
<p>Dies hier funktioniert zwar ....</p>
<pre><code class="language-cpp">void* operator new(size_t t, int a)
{ zzz* z= (zzz*) new BYTE[t];
  z-&gt;preInit(a);
  return z;
}

/// ... main ...

ZZZ *z = new(a) ZZZ(xyz);
//...
delete [] z;
</code></pre>
<p>.... ist aber untauglich. Vorallem weil in ZZZ keine Destruktoren mehr funktionieren (kein Wunder, ich habe ja auch BYTE's alloziert).</p>
<p>Ich habe innerhalb des new(size_t, int) den Typ ZZZ nicht zur Verfügung. Nur seine Grösse. Deshalb weiss ich nicht, wie ich es besser machen kann.</p>
<p>hgf</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/144959/new-überschreiben</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 20:39:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/144959.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Apr 2006 16:13:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new überschreiben on Sun, 23 Apr 2006 16:13:58 GMT]]></title><description><![CDATA[<p>Ich möchte den operator new überladen, um eine zusätzliche Variable a zu übergeben.<br />
Es soll eine Klasse ZZZ erzeugt werden:</p>
<pre><code class="language-cpp">struct ZZZ : public zzz {...};
</code></pre>
<p>Der überladene Operator kennt die Basisklasse zzz, nicht aber ZZZ.</p>
<p>Dies hier funktioniert zwar ....</p>
<pre><code class="language-cpp">void* operator new(size_t t, int a)
{ zzz* z= (zzz*) new BYTE[t];
  z-&gt;preInit(a);
  return z;
}

/// ... main ...

ZZZ *z = new(a) ZZZ(xyz);
//...
delete [] z;
</code></pre>
<p>.... ist aber untauglich. Vorallem weil in ZZZ keine Destruktoren mehr funktionieren (kein Wunder, ich habe ja auch BYTE's alloziert).</p>
<p>Ich habe innerhalb des new(size_t, int) den Typ ZZZ nicht zur Verfügung. Nur seine Grösse. Deshalb weiss ich nicht, wie ich es besser machen kann.</p>
<p>hgf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043408</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Sun, 23 Apr 2006 16:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Sun, 23 Apr 2006 16:54:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void zzz::operator new(size_t size, int a)
{
    void *p;
    if(size != sizeof(zzz))
        p = ::operator new(size);
    else
        // Deine gewohnte Allozierung
}
</code></pre>
<p>Jetzt noch preInit() virtuell machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043451</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 23 Apr 2006 16:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Mon, 24 Apr 2006 06:56:22 GMT]]></title><description><![CDATA[<p>Außerdem solltest du auch noch operator delete passend zu deinem new-Operator überladen, sonst bekommst du Probleme mit der Speicherfreigabe.</p>
<p>(und die Zusammenarbeit zwischen new und delete[] ist schon ohne diese Überladungen problematisch)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20068">@Michael</a>: Virtuelle Funktionen und nicht-initialisierter Speicher? Bist du sicher, daß das gut gehen kann? (ich bezweifle, daß *p eine brauchbare vtable bekommt, wenn es als char[] angelegt wurde)</p>
<p>PS: Ist das wirklich notwendig, a über operator new mitzugeben? Du könntest doch auch einen Ctor mit zwei Parametern füttern, der die notwendigen Arbeiten erledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043740</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 24 Apr 2006 06:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Mon, 24 Apr 2006 09:04:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20068">@Michael</a></p>
<p>Danke. Funktioniert so ganz gut. Die if/else Abfrage lasse ich lieber weg. Ansonsten wird bei der Erzeugung der Basisklasse zzz der Constructor von zzz zweimal aufgerufen (einmal nach ::new und einmal bei der geschweiften Klammer von zzz::new() ).</p>
<pre><code class="language-cpp">void* operator new(size_t size, int a) 
{ 
    void *p; 
    //if(size != sizeof(zzz)) 
        p = ::operator new(size); 
    //else 
    //    p = ::new zzz;
    ((zzz*)p)-&gt;preInit(a, 101); 
    return p;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a></p>
<p>Den Parameter im Konstruktor übergeben, wäre eine Alternative. Aber zumindest weiss ich jetzt besser wie new funktioniert.</p>
<p>Ich habe keine Ahnung, wie es aussehen müsste das delete zu überschreiben. Aber delete funktioniert jetzt glatt ohne Speicherleck. Das delete [] hat sich zusammen mit dem new [] ja erledigt.</p>
<p>Ob virtual preInit() funktionieren würde habe ich noch nicht getestet.<br />
Dass preInit() vor dem Ctor aufgerufen wird, ist vielleicht etwas irregulär, aber für meine Zwecke ok.</p>
<p>EDIT:<br />
virtuelles preInit() scheint nicht zu funktionieren: EAccessViolation</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043786</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Mon, 24 Apr 2006 09:04:28 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Mon, 24 Apr 2006 10:10:20 GMT]]></title><description><![CDATA[<blockquote>
<p>Die if/else Abfrage lasse ich lieber weg. Ansonsten wird bei der Erzeugung der Basisklasse zzz der Constructor von zzz zweimal aufgerufen (einmal nach ::new und einmal bei der geschweiften Klammer von zzz::new() ).</p>
</blockquote>
<p>operator new kümmert sich selber nur um die Speicherverwaltung - da werden überhaupt keine Konstruktoren aufgerufen.</p>
<p>hgf schrieb:</p>
<blockquote>
<p>Ich habe keine Ahnung, wie es aussehen müsste das delete zu überschreiben. Aber delete funktioniert jetzt glatt ohne Speicherleck. Das delete [] hat sich zusammen mit dem new [] ja erledigt.</p>
</blockquote>
<p>Ganz sicher bin ich auch nicht, aber es müsste in etwa so aussehen:</p>
<pre><code class="language-cpp">void operator delete(void*p,int a)
{
  //Aufräumarbeiten
  delete[] (char*)p;
}
</code></pre>
<p>(p ist der Zeiger, den op new() geliefert hat, a hat die selbe Bedeutung wie beim new)</p>
<blockquote>
<p>Ob virtual preInit() funktionieren würde habe ich noch nicht getestet.<br />
Dass preInit() vor dem Ctor aufgerufen wird, ist vielleicht etwas irregulär, aber für meine Zwecke ok.</p>
</blockquote>
<p>Vor dem Konstruktor-Aufruf kannst du virtuelle Funktionen definitiv nicht einsetzen. Dazu benötigst du schließlich den vptr deiner Klasse und der wird erst im Konstruktor initialisiert (afaik zwischen der Initialisierungsliste und dem Methodenrumpf des Ctor's).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043833</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 24 Apr 2006 10:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Mon, 24 Apr 2006 12:59:14 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20068">@Michael</a>: Virtuelle Funktionen und nicht-initialisierter Speicher? Bist du sicher, daß das gut gehen kann? (ich bezweifle, daß *p eine brauchbare vtable bekommt, wenn es als char[] angelegt wurde)</p>
</blockquote>
<p>Hast Recht, hatte ne ganz vermurkste Vorstellung vom new-Operator <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1043985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1043985</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 24 Apr 2006 12:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Mon, 24 Apr 2006 20:13:48 GMT]]></title><description><![CDATA[<blockquote>
<p>Ganz sicher bin ich auch nicht, aber es müsste in etwa so ....</p>
</blockquote>
<p>Habe jetzt auch das überladene delete(...) getestet. Wenn man die Operatoren in der Klasse definiert, spielen die Argumente offenbar keine grosse Rolle für die Auswahl des Operators (kein int a als Argument von delete notwendig).</p>
<pre><code class="language-cpp">void* zzz::operator new(size_t size, int a) 
  { 
    void *p; 

    p = malloc(size);
    //p = new char[size];
    //p = ::operator new(size); 

    ((zzz*)p)-&gt;preInit(a, 101); 
    return p;
  } 

  void zzz::operator delete(void* p)
  { 
    free(p);
    //::delete [] (float*)p;
    //::delete (void*)p;
  }
</code></pre>
<p>Die jeweiligen Pärchen</p>
<p>malloc() - free()<br />
new char[] - delete []<br />
::operator new - delete</p>
<p>scheinen alle gleich gut zu funktionieren.<br />
::operator new - delete ist wohl die empfohlene C++ Lösung.</p>
<p>Wie der Pointer p im zzz::delete(p) gecastet ist, scheint auch keine Rolle zu spielen. Nur darf er nicht zzz* sein, sonst kommt es zu rekursiven Aufrufen von delete. (Aber float* geht auch, obwohl es keinerlei Sinn macht.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1044452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1044452</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Mon, 24 Apr 2006 20:13:48 GMT</pubDate></item><item><title><![CDATA[Reply to new überschreiben on Tue, 25 Apr 2006 06:25:00 GMT]]></title><description><![CDATA[<p>zum direkten Aufruf von &quot;::operator new(s);&quot; sollte eigentlich &quot;::operator delete(p);&quot; gehören, wenn mich nicht alles täuscht. Und das Gecaste dürfte dann auch überflüssig sein, außer du willst eine zu deiner preInit() entsprechende postDestroy()-Methode aufrufen (wobei ich nicht weiß, wofür die notwendig wäre - die entsprechenden Arbeitsschritte passen doch problemlos in den Destruktor).</p>
<p>PS: *brigens muß operator new nicht unbedingt genau &quot;size&quot; Byte anfordern, du kannst auch zusätzlichen Speicher holen (und selber füllen) oder mit new/delete deinen eigenen Speicherpool verwalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1044573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1044573</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 25 Apr 2006 06:25:00 GMT</pubDate></item></channel></rss>