<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>vector.clear() - destructor not called?</title>
		<link>http://www.allegro.cc/forums/view/599750</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 30 Mar 2009 10:41:21 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hiho,</p><p>I have a class containing the following:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">typedef</span> std::vector<span class="k3">&lt;</span>CBasicButton<span class="k3">*</span><span class="k3">&gt;</span> button_vector_type<span class="k2">;</span>

<span class="k1">class</span> CButtonMenu
<span class="k2">{</span>
private:
  button_vector_type button_list<span class="k2">;</span>
...
<span class="k2">}</span>
</pre></div></div><p>
and in the destrutor I have:
</p><div class="source-code snippet"><div class="inner"><pre>CButtonMenu::~CButtonMenu<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
  this-&gt;button_list.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

I have a breakpoint in the destrutor of CBasicButton but it is NOT called...<br />In the <a href="http://www.cplusplus.com/reference/stl/vector/clear.html">reference</a> I read this:
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/599750/802702#target">Christopher Bludau</a> said:</div><div class="quote"><p>
vector::clear	public member function<br />void clear ( );	</p><p>Clear content</p><p>All the elements of the vector are dropped: <b>their destructors are called</b>, and then they are removed from the vector container, leaving the container with a size of 0.
</p></div></div><p>

What did I miss? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (count)</author>
		<pubDate>Sun, 29 Mar 2009 02:10:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Clearing a vector doesn&#39;t free the (pointer) objects inside them, nor does it call their destructors.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Sun, 29 Mar 2009 02:14:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The elements you are storing are pointers. Pointers have no destructors, they are just addresses to memory elsewhere.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Sun, 29 Mar 2009 02:15:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Could probably use one of the &lt;algorithm&gt; or whatever functions to do something like: <span class="source-code">foreach<span class="k2">(</span>vec, <span class="k1">delete</span><span class="k2">)</span><span class="k2">;</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 29 Mar 2009 02:17:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I figured that out the hard way too.<br />I would call each element&#39;s destructor first and then clear the vector.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sun, 29 Mar 2009 02:44:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, so the reference and destructor part is only true when the vector contains objects and not pointers. Makes sense.</p><p>Which means I have to delete the stuff myself. Just thought that I don&#39;t have to when I read the reference.</p><p>Thanks!</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/599750/802718#target">Schyfis</a> said:</div><div class="quote"><p>
I would call each element&#39;s constructor
</p></div></div><p>

constructor?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (count)</author>
		<pubDate>Sun, 29 Mar 2009 03:17:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Typo, destructor.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Schyfis)</author>
		<pubDate>Sun, 29 Mar 2009 05:59:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>A little smart pointer magic can make it automated.
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include &lt;boost/shared_ptr.hpp&gt;</span>
<span class="p">#include &lt;vector&gt;</span>

<span class="k1">typedef</span> boost::shared_ptr<span class="k3">&lt;</span>CBasicButton&gt; button_ptr_type<span class="k2">;</span>
<span class="k1">typedef</span> std::vector<span class="k3">&lt;</span>button_ptr_type&gt; button_vector_type<span class="k2">;</span>
</pre></div></div><p>
You shouldn&#39;t need to call <span class="source-code">this-&gt;button_list.clear<span class="k2">(</span><span class="k2">)</span></span> in your destructor because your <span class="source-code">button_vector_type</span> property is static. When the <span class="source-code">CButtonMenu</span> instance is destroyed, the vector and all of its contents will automatically be cleaned up because they&#39;re stack allocated. The only concern is whether or not the vector contains dynamically allocated memory, which would need to be deallocated first (which again is where smart pointers come in).</p><p>Working example:
</p><div class="source-code"><div class="toolbar"><span class="name">main.hpp</span><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="p">#ifndef MAIN_HPP</span>
<span class="number">  2</span>  <span class="p">#define MAIN_HPP</span>
<span class="number">  3</span>
<span class="number">  4</span>  <span class="p">#include &lt;boost/shared_ptr.hpp&gt;</span>
<span class="number">  5</span>  <span class="p">#include &lt;iostream&gt;</span>
<span class="number">  6</span>  <span class="p">#include &lt;vector&gt;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">class</span> Example<span class="k2">;</span>
<span class="number">  9</span><span class="k1">typedef</span> boost::shared_ptr<span class="k3">&lt;</span>Example&gt; Example_ptr<span class="k2">;</span>
<span class="number"> 10</span><span class="k1">typedef</span> std::vector<span class="k3">&lt;</span>Example_ptr&gt; Example_ptr_vec<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">class</span> Example
<span class="number"> 13</span><span class="k2">{</span>
<span class="number"> 14</span>public:
<span class="number"> 15</span>  <span class="k1">int</span> x<span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>  Example<span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>  ~Example<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  <span class="k1">void</span> Print<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k1">const</span><span class="k2">;</span>
<span class="number"> 21</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span>, <span class="k1">char</span> <span class="k3">*</span><span class="k2">[</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span><span class="k1">void</span> test<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>
<span class="number"> 26</span><span class="p">#endif</span>
</div></div><p>
</p><div class="source-code"><div class="toolbar"><span class="name">main.cpp</span><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="p">#include "main.hpp"</span>
<span class="number">  2</span>
<span class="number">  3</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>argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Before..."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  6</span>  test<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"...After."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">void</span> test<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 13</span><span class="k2">{</span>
<span class="number"> 14</span>  Example_ptr x<span class="k2">;</span>
<span class="number"> 15</span>  Example_ptr_vec v<span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>  x.reset<span class="k2">(</span><span class="k1">new</span> Example<span class="k2">(</span><span class="n">5</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>  v.push_back<span class="k2">(</span>x<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>  v<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Print<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span><span class="k2">}</span>
<span class="number"> 22</span>
<span class="number"> 23</span>Example::Example<span class="k2">(</span><span class="k1">int</span> x<span class="k2">)</span><span class="k2">:</span>
<span class="number"> 24</span>  x<span class="k2">(</span>x<span class="k2">)</span>
<span class="number"> 25</span><span class="k2">{</span>
<span class="number"> 26</span><span class="k2">}</span>
<span class="number"> 27</span>
<span class="number"> 28</span>Example::~Example<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 29</span><span class="k2">{</span>
<span class="number"> 30</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Example destroyed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 31</span><span class="k2">}</span>
<span class="number"> 32</span>
<span class="number"> 33</span><span class="k1">void</span> Example::Print<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 34</span><span class="k2">{</span>
<span class="number"> 35</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Example{x:"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> this-&gt;x <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"}"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 36</span><span class="k2">}</span>
</div></div><p>
</p><pre class="terminal">[bamccaig@rufus smartptr]$ g++ main.cpp -o smartptr
[bamccaig@rufus smartptr]$ ./smartptr
Before...
Example{x:5}
Example destroyed.
...After.</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Mon, 30 Mar 2009 10:41:21 +0000</pubDate>
	</item>
</rss>
