<?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[operator new Parameter übergeben]]></title><description><![CDATA[<p>Hi,</p>
<p>eigentlich bin ich ja aus der C-Welt, aber manchmal komme ich an C++ nicht vorbei. Aus diesem Grund habe ich mal eine Frage an die C++-Kenner. <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 entwickle momentan ein eigenes Apache-Module, Apache stellt zum entwickeln von Modulen die APR zur verfügung. Diese Combo aus Schnittstelle und Framework benutzt ein malloc/free-like Memory-Management, aber auf Pool-Basis.</p>
<p>Kurz: Beim aufruf von apr_malloc muss ein Pool übergeben werden, also ein Context-bezogener &quot;Memory-Manager&quot;.</p>
<p>Das sieht dann ggf. so aus:</p>
<pre><code class="language-cpp">int8_t foobar(APR_Request* request)
{
    uchar8_t* buffer = apr_malloc(request-&gt;pool, sizeof(uchar8_t) * 128);

    /* Mach was mit &quot;buffer&quot;. */

    /* Optional kann apr_free aufgerufen werden für &quot;buffer&quot;, 
       jedoch nicht umbedingt nötig, da &quot;pool&quot; von &quot;request&quot; 
       nach der zerstörung von Request auch freigegebe wird. 

       apr_free(buffer);
     */

    return 0;
}
</code></pre>
<p>Soviel zur Kurzerklärung vom Pooling in Apache. Das ist auch ne ganz feine Sache, jedoch ist die APR rein C. Würde ich jetzt eine Klasse bzw. ein Array von Klassen mit apr_malloc aufrufen, wird natürlich nicht der c'tor der Klasse aufgerufen, da dies nur der operator new kann.</p>
<p>Jetzt ist meine Frage: wie kann ich einen Context-bezogenen &quot;pool&quot;, also Parameter, an operator new übergeben? Da das ganze Thread-sicher sein muss kann ich nicht einfach eine globale Funktion anlegen á la &quot;setUsedPoolForOperatorNew&quot;.</p>
<p>Auch die expliziete Implementierung von operator new in Klassen geht nicht, da diese Context-unabhängig sein müssen und erst durch new einem speziellen Context zugeordnet werden.</p>
<p>Aus diesem Grund dachte ich an etwas in dieser Richtung:</p>
<pre><code class="language-cpp">// Ein Array mit 4 Instanzen von &quot;Foobar&quot; erstellen auf dem pool vom Context &quot;request&quot;.
Foobar* foos = new (request-&gt;pool)[4] Foobar();
</code></pre>
<p>Ist so etwas möglich, wenn ja: Wie? Wenn das nicht möglich ist, gibt es eine thread-sichere alternative wo die Klassen Context-unabhängig sind?</p>
<p>Viele Grüße,<br />
euer C++-Coder</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273683/operator-new-parameter-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 23:25:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273683.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 11 Sep 2010 07:58:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator new Parameter übergeben on Sat, 11 Sep 2010 07:58:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>eigentlich bin ich ja aus der C-Welt, aber manchmal komme ich an C++ nicht vorbei. Aus diesem Grund habe ich mal eine Frage an die C++-Kenner. <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 entwickle momentan ein eigenes Apache-Module, Apache stellt zum entwickeln von Modulen die APR zur verfügung. Diese Combo aus Schnittstelle und Framework benutzt ein malloc/free-like Memory-Management, aber auf Pool-Basis.</p>
<p>Kurz: Beim aufruf von apr_malloc muss ein Pool übergeben werden, also ein Context-bezogener &quot;Memory-Manager&quot;.</p>
<p>Das sieht dann ggf. so aus:</p>
<pre><code class="language-cpp">int8_t foobar(APR_Request* request)
{
    uchar8_t* buffer = apr_malloc(request-&gt;pool, sizeof(uchar8_t) * 128);

    /* Mach was mit &quot;buffer&quot;. */

    /* Optional kann apr_free aufgerufen werden für &quot;buffer&quot;, 
       jedoch nicht umbedingt nötig, da &quot;pool&quot; von &quot;request&quot; 
       nach der zerstörung von Request auch freigegebe wird. 

       apr_free(buffer);
     */

    return 0;
}
</code></pre>
<p>Soviel zur Kurzerklärung vom Pooling in Apache. Das ist auch ne ganz feine Sache, jedoch ist die APR rein C. Würde ich jetzt eine Klasse bzw. ein Array von Klassen mit apr_malloc aufrufen, wird natürlich nicht der c'tor der Klasse aufgerufen, da dies nur der operator new kann.</p>
<p>Jetzt ist meine Frage: wie kann ich einen Context-bezogenen &quot;pool&quot;, also Parameter, an operator new übergeben? Da das ganze Thread-sicher sein muss kann ich nicht einfach eine globale Funktion anlegen á la &quot;setUsedPoolForOperatorNew&quot;.</p>
<p>Auch die expliziete Implementierung von operator new in Klassen geht nicht, da diese Context-unabhängig sein müssen und erst durch new einem speziellen Context zugeordnet werden.</p>
<p>Aus diesem Grund dachte ich an etwas in dieser Richtung:</p>
<pre><code class="language-cpp">// Ein Array mit 4 Instanzen von &quot;Foobar&quot; erstellen auf dem pool vom Context &quot;request&quot;.
Foobar* foos = new (request-&gt;pool)[4] Foobar();
</code></pre>
<p>Ist so etwas möglich, wenn ja: Wie? Wenn das nicht möglich ist, gibt es eine thread-sichere alternative wo die Klassen Context-unabhängig sind?</p>
<p>Viele Grüße,<br />
euer C++-Coder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951169</guid><dc:creator><![CDATA[C++-Coder]]></dc:creator><pubDate>Sat, 11 Sep 2010 07:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sat, 11 Sep 2010 08:24:36 GMT]]></title><description><![CDATA[<p>Suche mal nach &quot;placement new&quot;<br />
damit kannst du new sagen, wo es das Objekt konstruieren soll, ohne dass es Speicher anfordert. D.h. du holst dir erst Speicher aus dem Pool und dann darauf ein placement new</p>
<p>Hier noch was genaueres hierzu:<br />
<a href="http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14" rel="nofollow">http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951174</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 11 Sep 2010 08:24:36 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sat, 11 Sep 2010 08:19:08 GMT]]></title><description><![CDATA[<p>Dank dir! Das war genau das wonach ich gesucht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951177</guid><dc:creator><![CDATA[C++-Coder]]></dc:creator><pubDate>Sat, 11 Sep 2010 08:19:08 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sat, 11 Sep 2010 13:06:52 GMT]]></title><description><![CDATA[<p>Und vergiss nicht, die Klasse wieder zu zerstören, bevor ihr Speicher freigegeben wird. Dazu kannst du den Destruktor explizit aufrufen.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-269358" rel="nofollow">Link</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951289</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 11 Sep 2010 13:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sun, 12 Sep 2010 09:46:50 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ja mit dem Destruktor habe ich noch 1-2 Probleme, da ich für meinen Pool eine &quot;clear&quot;-Methode benötige und dort keine Klassennamen mehr kenne für einen expliziten Aufruf des Destruktors.</p>
<p>But anyway, ich möchte delete einen weiteren Parameter übergeben, jedoch führt ein manueller Aufruf von delete den Destruktor nicht mehr aus, warum?</p>
<pre><code class="language-cpp">class Foobar
{
public:
	Foobar()
	{
		printf(&quot;%s\n&quot;, __FUNCTION__);
	}

	~Foobar()
	{
		printf(&quot;%s\n&quot;, __FUNCTION__);
	}
};

void * operator new(size_t size, size_t&amp; dummy)
{
	printf(&quot;%s\n&quot;, __FUNCTION__);

	++dummy;

	return malloc(size);
}

void operator delete(void *p, size_t&amp; dummy)
{
	printf(&quot;%s\n&quot;, __FUNCTION__);

	--dummy;

	free(p);
}

int main()
{
	size_t dummy = 0;

	Foobar* x = new (dummy) Foobar();
	operator delete(x, dummy); // Es wird kein d'tor aufgerufen?
}
</code></pre>
<p>Viele Grüße,<br />
euer C++-Coder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951465</guid><dc:creator><![CDATA[C++-Coder]]></dc:creator><pubDate>Sun, 12 Sep 2010 09:46:50 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sun, 12 Sep 2010 13:00:50 GMT]]></title><description><![CDATA[<p>C++-Coder schrieb:</p>
<blockquote>
<p>ja mit dem Destruktor habe ich noch 1-2 Probleme, da ich für meinen Pool eine &quot;clear&quot;-Methode benötige und dort keine Klassennamen mehr kenne für einen expliziten Aufruf des Destruktors.</p>
</blockquote>
<p>Wie wärs mit einem Template?</p>
<p>C++-Coder schrieb:</p>
<blockquote>
<p>But anyway, ich möchte delete einen weiteren Parameter übergeben, jedoch führt ein manueller Aufruf von delete den Destruktor nicht mehr aus, warum?</p>
</blockquote>
<p>Weil er das nie tut. <code>operator delete</code> gibt nur Speicher frei. <code>delete</code> hingegen ruft den Destruktor und <code>operator delete</code> auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951550</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 12 Sep 2010 13:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sun, 12 Sep 2010 14:32:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Nun, weil das Apache-Modul über mehrere *.so-Dateien verteilt ist und dynamisch sein muss. Darum sind Templates nicht möglich. Leider.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951607</guid><dc:creator><![CDATA[C++-Coder]]></dc:creator><pubDate>Sun, 12 Sep 2010 14:32:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator new Parameter übergeben on Sun, 12 Sep 2010 14:45:04 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>Suche mal nach &quot;placement new&quot;<br />
damit kannst du new sagen, wo es das Objekt konstruieren soll, ohne dass es Speicher anfordert. D.h. du holst dir erst Speicher aus dem Pool und dann darauf ein placement new</p>
<p>Hier noch was genaueres hierzu:<br />
<a href="http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14" rel="nofollow">http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14</a></p>
</blockquote>
<p>Danke Dir für den Link, das ist eine sehr interessante Lektüre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1951616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1951616</guid><dc:creator><![CDATA[scorcher24@public.pc]]></dc:creator><pubDate>Sun, 12 Sep 2010 14:45:04 GMT</pubDate></item></channel></rss>