<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Shared_ptr with event queues</title>
		<link>http://www.allegro.cc/forums/view/608659</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 24 Oct 2011 10:40:29 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So I just recently decided to switch to smart pointers in my multithreaded client. I am currently having problems since pointers(shared_ptr) through the event queue. (By this I mean user events). I did try using a shared_ptr pointer, but that gave me a segmentation fault when I had another shared_ptr inside the shared_ptr structure. Here&#39;s an example on what I mean since it sounds a bit confusing:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">struct</span> Bitmap
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    std::shared_ptr<span class="k3">&lt;</span>ALLEGRO_BITMAP&gt; bitmap<span class="k2">;</span>
<span class="number">  4</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>std::shared_ptr<span class="k3">&lt;</span>Bitmap&gt; variable<span class="k2">(</span><span class="k1">new</span> Bitmap<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number">  8</span>event.type <span class="k3">=</span> USER_EVENT_BITMAP_LOAD<span class="k2">;</span>
<span class="number">  9</span>event.user.data1 <span class="k3">=</span> <span class="k3">&amp;</span>variable<span class="k2">;</span>
<span class="number"> 10</span><a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span>eventSrc, <span class="k3">&amp;</span>event, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span>
<span class="number"> 12</span>std::shared_ptr<span class="k3">&lt;</span>Bitmap&gt; bitmap <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span>std::shared_ptr<span class="k3">&lt;</span>Bitmap&gt; <span class="k3">*</span><span class="k2">)</span>event.user.data1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span><span class="c">// This is where I get a segmentation fault because of the shared_ptr inside the Bitmap structure.</span>
</div></div><p>

My main question that I am asking is, what is a way to pass a smart pointer through a event queue? If the best way is to use a shared_ptr pointer like I did, could someone please explain how I could fix the segmentation fault?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Addison Elliott)</author>
		<pubDate>Mon, 24 Oct 2011 08:23:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The entire purpose of a <span class="source-code">shared_ptr</span> is to destroy the object when all pointers to it are destroyed. As a rule, you should <i>never</i> take the address (pointer to) a smart pointer. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> That defeats the purpose. I don&#39;t think you&#39;re going to be able to use a smart pointer for this without negating the purpose of having a smart pointer in the first place. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> You&#39;re unfortunately going to have to manage the memory yourself.</p><p>The internal <span class="source-code">shared_ptr</span> is fine (<span class="source-code">Bitmap::bitmap</span>), but the stack-allocated smart pointer <span class="source-code">variable</span> will be destroyed as soon as it goes out of scope. As a consequence, it will also destroy the <span class="source-code">Bitmap</span> inside of it, and the <span class="source-code">Bitmap::bitmap</span> inside of that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Mon, 24 Oct 2011 08:31:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Eh you&#39;re breaking my heart <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /> I was hoping for a 1 line fix <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><br />I&#39;ll look it over in the morning and look for other options.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Addison Elliott)</author>
		<pubDate>Mon, 24 Oct 2011 08:48:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, a shared pointer will just not work here, at least not inside of the event itself.</p><p>Something more like :
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/ALLEGRO_USER_EVENT"><span class="a">ALLEGRO_USER_EVENT</span></a> usr<span class="k2">;</span>
usr.type <span class="k3">=</span><span class="k3">=</span> USER_EVENT_BITMAP_LOAD<span class="k2">;</span>
usr.user.data1 <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span>Path<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span>event_source , <span class="k3">&amp;</span>usr , NULL<span class="k2">)</span><span class="k2">;</span>

<span class="c">//...</span>

<a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>event_queue , <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span>event.type <span class="k3">=</span><span class="k3">=</span> USER_EVENT_BITMAP_LOAD<span class="k2">)</span> <span class="k2">{</span>
   my_bitmaps_vector.push_back<span class="k2">(</span>shared_ptr<span class="k3">&lt;</span>ALLEGRO_BITMAP&gt;<span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span><span class="k2">)</span>event.user.data1<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Your ALLEGRO_BITMAP* will be temporarily unavailable to destroy until you retrieve the event itself.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 24 Oct 2011 10:40:29 +0000</pubDate>
	</item>
</rss>
