<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Allegro 5 and shared_ptr: Crash on exit</title>
		<link>http://www.allegro.cc/forums/view/611628</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 16 Dec 2012 19:51:47 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Anyone can figure out why this is crashing <i>on exit</i> (EXC_BAD_ACCESS)?</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>Application::Application<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>    
<span class="number">  3</span><span class="k2">}</span>
<span class="number">  4</span>
<span class="number">  5</span>Application::~Application<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  6</span>    
<span class="number">  7</span>    <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>    <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>    <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    
<span class="number"> 12</span><span class="k2">}</span>
<span class="number"> 13</span>
<span class="number"> 14</span><span class="k1">void</span> Application::init<span class="k2">(</span><span class="k1">int</span>                argc,
<span class="number"> 15</span>                       <span class="k1">char</span>               <span class="k3">*</span><span class="k3">*</span>argv,
<span class="number"> 16</span>                       <span class="k1">const</span> std::string  <span class="k3">&amp;</span>configFilename<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 17</span>    <span class="c">/* Initialize Allegro and everything */</span>
<span class="number"> 18</span><span class="k2">}</span>
<span class="number"> 19</span>
<span class="number"> 20</span><span class="k1">int</span> Application::run<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>    
<span class="number"> 22</span>    <span class="k1">bool</span> shouldExit <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 23</span>    <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    
<span class="number"> 25</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>shouldExit <span class="k3">&amp;</span><span class="k3">&amp;</span> gameStateManager-&gt;getActiveStateCount<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 26</span>       <span class="c">/* Do stuff */</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>    <a href="http://www.allegro.cc/manual/al_stop_timer"><span class="a">al_stop_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    
<span class="number"> 31</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 32</span><span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span><span class="c">// ApplicationPtr is a typedef of std::shared_ptr&lt;Application&gt;</span>
<span class="number"> 35</span><span class="c">// This is probably a bad way of doing singleton, but heck,</span>
<span class="number"> 36</span><span class="c">// I'm rushing for Santahack!</span>
<span class="number"> 37</span>ApplicationPtr Application::GetInstance<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 38</span>    <span class="k1">static</span> ApplicationPtr application <span class="k3">=</span> std::make_shared<span class="k3">&lt;</span>Application&gt;<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    <span class="k1">return</span> application<span class="k2">;</span>
<span class="number"> 40</span><span class="k2">}</span>
</div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="p">#include "Application.h"</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span> <span class="k2">{</span>
    
    ApplicationPtr app <span class="k3">=</span> Application::GetInstance<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    app-&gt;init<span class="k2">(</span>argc, argv, <span class="s">"data/config.ini"</span><span class="k2">)</span><span class="k2">;</span>
    app-&gt;run<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    
    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
    
<span class="k2">}</span>
</pre></div></div><p>

I don&#39;t know how to get the stack trace in Xcode, so here&#39;s a screenshot of it instead. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p><span class="remote-thumbnail"><span class="json">{"name":"607036","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/9\/79870dd1522dad465e4890e48735dccc.png","w":339,"h":500,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/7\/9\/79870dd1522dad465e4890e48735dccc"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/7/9/79870dd1522dad465e4890e48735dccc-240.jpg" alt="607036" width="240" height="353" /></span></p><p>This is my first time using smart pointers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Sun, 16 Dec 2012 18:03:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My guess is you call Allegro functions after shutting down Allegro. By default Allegro gets shut down at the end of the main() function, but global destructors are called afterwards.</p><p>You could use <span class="source-code"><a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a></span> instead of al_init and pass your own atexit function to prevent the automatic shutdown at the end of main().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sun, 16 Dec 2012 18:19:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Elias has got it right. If you want to continue making your program the way you are, you need to explicitly create and destroy your Application object in your main() procedure like this:</p><div class="source-code snippet"><div class="inner"><pre>Application <span class="k3">*</span>myapp <span class="k3">=</span> <span class="k1">new</span> Application<span class="k2">;</span>

<span class="c">// Do Stuff</span>

<span class="k1">delete</span> myapp<span class="k2">;</span>
</pre></div></div><p>

This way, Allegro won&#39;t auto-shutdown after main() returns before your Application objects are destroyed. ALL objects with Allegro functions in them MUST be created explicitly for this reason.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Sun, 16 Dec 2012 19:36:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, you&#39;re right. I fixed it by using <span class="source-code"><a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a></span>, passing a dummy function as the second argument.</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// I'm dumb!</span>
<span class="k1">int</span> DummyExitFunction<span class="k2">(</span><span class="k1">void</span> <span class="k2">(</span><span class="k3">*</span>stuff<span class="k2">)</span><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>

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

<a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a><span class="k2">(</span>ALLEGRO_VERSION_INT, DummyExitFunction<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

I still don&#39;t get why the function needs to have that weird signature instead of just <span class="source-code"><span class="k1">void</span> <span class="k2">(</span><span class="k3">*</span><span class="k2">)</span><span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></span>. But who cares for now, as long as it works! Thanks! <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Sun, 16 Dec 2012 19:42:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>One big catch you may run into with your current approach is the order in which your objects are removed from memory, specifically if you place Allegro code into the destructors of even more implicitly declared objects. In this event, the order in which you create your objects will be important so that the one that actually shuts down Allegro in its destructor will be called last when your program exits.</p><p>Overall, it&#39;s still safer to explicitly declare any objects that have Allegro functions in their destructors. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Sun, 16 Dec 2012 19:51:47 +0000</pubDate>
	</item>
</rss>
