<?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[boost::shared_ptr mit Objekt variabler Größe]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>ich habe folgendes Problem: Ich möchte eine Struktur dynamischer Größe in einen <code>shared_ptr</code> verpacken, weiß aber nicht so wirklich, wie ich das angehen soll. Die Struktur hat deshalb eine dynamische Größe, weil sie aus einem Bitmapheader, einer Palette und dann den Bitmapdaten selbst besteht. Die Größe der Bitmapdaten hängen natürlich von der Größe und Farbtiefe ab, im Groben sieht die Struktur so aus:</p>
<pre><code class="language-cpp">// Struktur ist byte aligned
#pragma push -a1

struct Bitmap
{
   BITMAPINFOHEADER BitmapInfo;
   RGBQUAD Palette[256];   
   unsigned char BitmapData[];

   void foo();
   void bar();
};
#pragma pop
</code></pre>
<p>Bisher sah die Erzeugerfunktion so aus:</p>
<pre><code class="language-cpp">Bitmap* create_bitmap( unsigned int w, unsigned int h, unsigned char bpp )
{
   unsigned int Size = sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) + (w * h * bpp);

   Bitmap* bmp = (Bitmap*) malloc( Size );

   // bmp initialisieren

   return bmp;
}
</code></pre>
<p>Das möchte ich jetzt vernünftig in einen <code>smart_ptr</code> verpacken, <strong>darf aber die Bitmap Struktur nicht anfassen</strong> sondern nur die Erzeugerfunktion. Das Problem ist, dass die Bitmap Struktur bei der Erzeugung eigentlich keine Struktur, sondern nur ein Byte Array ist. Bin mir sogar nicht einmal sicher, ob das valides C/C++ ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302791/boost-shared_ptr-mit-objekt-variabler-größe</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 03:12:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302791.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Apr 2012 07:58:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Fri, 27 Apr 2012 08:12:30 GMT]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>ich habe folgendes Problem: Ich möchte eine Struktur dynamischer Größe in einen <code>shared_ptr</code> verpacken, weiß aber nicht so wirklich, wie ich das angehen soll. Die Struktur hat deshalb eine dynamische Größe, weil sie aus einem Bitmapheader, einer Palette und dann den Bitmapdaten selbst besteht. Die Größe der Bitmapdaten hängen natürlich von der Größe und Farbtiefe ab, im Groben sieht die Struktur so aus:</p>
<pre><code class="language-cpp">// Struktur ist byte aligned
#pragma push -a1

struct Bitmap
{
   BITMAPINFOHEADER BitmapInfo;
   RGBQUAD Palette[256];   
   unsigned char BitmapData[];

   void foo();
   void bar();
};
#pragma pop
</code></pre>
<p>Bisher sah die Erzeugerfunktion so aus:</p>
<pre><code class="language-cpp">Bitmap* create_bitmap( unsigned int w, unsigned int h, unsigned char bpp )
{
   unsigned int Size = sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) + (w * h * bpp);

   Bitmap* bmp = (Bitmap*) malloc( Size );

   // bmp initialisieren

   return bmp;
}
</code></pre>
<p>Das möchte ich jetzt vernünftig in einen <code>smart_ptr</code> verpacken, <strong>darf aber die Bitmap Struktur nicht anfassen</strong> sondern nur die Erzeugerfunktion. Das Problem ist, dass die Bitmap Struktur bei der Erzeugung eigentlich keine Struktur, sondern nur ein Byte Array ist. Bin mir sogar nicht einmal sicher, ob das valides C/C++ ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206009</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 27 Apr 2012 08:12:30 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Fri, 27 Apr 2012 08:16:39 GMT]]></title><description><![CDATA[<p>So würde es gehen:</p>
<pre><code class="language-cpp">boost::shared_ptr&lt;Bitmap&gt; create_bitmap( unsigned int w, unsigned int h, unsigned char bpp )
{
    unsigned int Size = sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) + (w * h * bpp);
    return boost::shared_ptr&lt;Bitmap&gt;(static_cast&lt;Bitmap*&gt;(std::malloc(Size)), &amp;std::free);
}
</code></pre>
<p>allerdings ist das <code>unsigned char BitmapData[];</code> kein gültiges C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206017</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 27 Apr 2012 08:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Fri, 27 Apr 2012 08:34:26 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Bin mir sogar nicht einmal sicher, ob das valides C/C++ ist.</p>
</blockquote>
<p>Ist es nicht. Um da verlässlichen, portablen, sicheren, (...) Code zu haben, solltest du die API, die dir das nicht zu ändernde Bitmap struct aufzwingt, wegkapseln und außerhalb mit einer ordentlichen C++-Struktur arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206021</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 27 Apr 2012 08:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Fri, 27 Apr 2012 08:37:31 GMT]]></title><description><![CDATA[<p>Danke, geht.<br />
Werde mal sehen, dass man das <code>unsigned char BitmapData[]</code> durch <code>unsigned char BitmapData[1]</code> ersetzt, damit wird´s gültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206022</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 27 Apr 2012 08:37:31 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Fri, 27 Apr 2012 11:28:24 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Danke, geht.<br />
Werde mal sehen, dass man das <code>unsigned char BitmapData[]</code> durch <code>unsigned char BitmapData[1]</code> ersetzt, damit wird´s gültig.</p>
</blockquote>
<p>*ieks* Gültig vielleicht. Aber nicht wirklich besonders schön...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206079</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 27 Apr 2012 11:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Fri, 27 Apr 2012 11:31:47 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Danke, geht.<br />
Werde mal sehen, dass man das <code>unsigned char BitmapData[]</code> durch <code>unsigned char BitmapData[1]</code> ersetzt, damit wird´s gültig.</p>
</blockquote>
<p>Wenn Du es so weit ändern kannst, dann kannste auch gleich <code>char *</code> davon machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206082</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 27 Apr 2012 11:31:47 GMT</pubDate></item><item><title><![CDATA[Reply to boost::shared_ptr mit Objekt variabler Größe on Sat, 28 Apr 2012 03:00:35 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>DocShoe schrieb:</p>
<blockquote>
<p>Danke, geht.<br />
Werde mal sehen, dass man das <code>unsigned char BitmapData[]</code> durch <code>unsigned char BitmapData[1]</code> ersetzt, damit wird´s gültig.</p>
</blockquote>
<p>Wenn Du es so weit ändern kannst, dann kannste auch gleich <code>char *</code> davon machen.</p>
</blockquote>
<p>Ich nix versteh.<br />
Da hängt ein Array hinten dran, direkt die Daten, kein Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206266</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 28 Apr 2012 03:00:35 GMT</pubDate></item></channel></rss>