<?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[Speicherleck]]></title><description><![CDATA[<p>Ich verwende &quot;crt dump memory leaks&quot; und versuche Speicherlecks zu finden.<br />
Es meldet bei diesem Programm welche:</p>
<pre><code class="language-cpp">#include &quot;ImageManager.h&quot;

ImageManager::ImageManager(std::string rel_path)
{

	boost::filesystem::path path(boost::filesystem::initial_path().string() + rel_path);
	boost::filesystem::directory_iterator end;

	if ( boost::filesystem::is_directory(path) ) 
	{
		int size = 0;
		for (boost::filesystem::directory_iterator iter(path); iter != end; ++iter)
			++size;

		images.reserve(size);

		std::size_t i = 0;
		for (boost::filesystem::directory_iterator iter(path); iter != end; ++iter, ++i)
		{
			sf::Image temp;
			sf::Sprite sprite;
			if (temp.LoadFromFile(iter-&gt;path().string()))
			{
				images.push_back(temp);
				sprite.SetImage(images[i]);
				sprites[iter-&gt;path().stem().string()] = sprite;
			}
		}
	}
	else
	{
		throw(std::logic_error(&quot;File not found&quot;));
	}
}

sf::Sprite ImageManager::get_sprite(std::string name)
{
	if (sprites.count(name))
		return sprites[name];
	else
		throw(std::logic_error(&quot;IMG not found&quot;));
}
</code></pre>
<pre><code class="language-cpp">#ifndef IMAGE_MANAGER_H
#define IMAGE_MANAGER_H

#include &lt;boost\filesystem\operations.hpp&gt;
#include &lt;boost\filesystem\path.hpp&gt;
#include &lt;SFML\Graphics.hpp&gt;

#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;stdexcept&gt;
#include &lt;cstddef&gt;

class ImageManager
{
public:
	ImageManager(std::string);
	sf::Sprite get_sprite(std::string name);
private:
	std::map&lt;std::string,sf::Sprite&gt; sprites;
	std::vector&lt;sf::Image&gt; images;
};

#endif
</code></pre>
<pre><code class="language-cpp">#define _CRTDBG_MAP_ALLOC
#include &lt;stdlib.h&gt;
#include &lt;crtdbg.h&gt;
#include &quot;ImageManager.h&quot;

int main()
{
	ImageManager img(&quot;/img&quot;);
	sf::RenderWindow App(sf::VideoMode(800, 600, 32), &quot;Image Management Test&quot;);
	 while (App.IsOpened())
    {
        // Process events
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }

		App.Clear();
		App.Draw(img.get_sprite(&quot;Unbenannt&quot;));
		App.Display();

	 }
	 _CrtDumpMemoryLeaks();
}
</code></pre>
<p>Ich kann das Leck einfach nicht finden!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307604/speicherleck</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 15:49:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307604.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Aug 2012 03:54:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 03:54:24 GMT]]></title><description><![CDATA[<p>Ich verwende &quot;crt dump memory leaks&quot; und versuche Speicherlecks zu finden.<br />
Es meldet bei diesem Programm welche:</p>
<pre><code class="language-cpp">#include &quot;ImageManager.h&quot;

ImageManager::ImageManager(std::string rel_path)
{

	boost::filesystem::path path(boost::filesystem::initial_path().string() + rel_path);
	boost::filesystem::directory_iterator end;

	if ( boost::filesystem::is_directory(path) ) 
	{
		int size = 0;
		for (boost::filesystem::directory_iterator iter(path); iter != end; ++iter)
			++size;

		images.reserve(size);

		std::size_t i = 0;
		for (boost::filesystem::directory_iterator iter(path); iter != end; ++iter, ++i)
		{
			sf::Image temp;
			sf::Sprite sprite;
			if (temp.LoadFromFile(iter-&gt;path().string()))
			{
				images.push_back(temp);
				sprite.SetImage(images[i]);
				sprites[iter-&gt;path().stem().string()] = sprite;
			}
		}
	}
	else
	{
		throw(std::logic_error(&quot;File not found&quot;));
	}
}

sf::Sprite ImageManager::get_sprite(std::string name)
{
	if (sprites.count(name))
		return sprites[name];
	else
		throw(std::logic_error(&quot;IMG not found&quot;));
}
</code></pre>
<pre><code class="language-cpp">#ifndef IMAGE_MANAGER_H
#define IMAGE_MANAGER_H

#include &lt;boost\filesystem\operations.hpp&gt;
#include &lt;boost\filesystem\path.hpp&gt;
#include &lt;SFML\Graphics.hpp&gt;

#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;map&gt;
#include &lt;stdexcept&gt;
#include &lt;cstddef&gt;

class ImageManager
{
public:
	ImageManager(std::string);
	sf::Sprite get_sprite(std::string name);
private:
	std::map&lt;std::string,sf::Sprite&gt; sprites;
	std::vector&lt;sf::Image&gt; images;
};

#endif
</code></pre>
<pre><code class="language-cpp">#define _CRTDBG_MAP_ALLOC
#include &lt;stdlib.h&gt;
#include &lt;crtdbg.h&gt;
#include &quot;ImageManager.h&quot;

int main()
{
	ImageManager img(&quot;/img&quot;);
	sf::RenderWindow App(sf::VideoMode(800, 600, 32), &quot;Image Management Test&quot;);
	 while (App.IsOpened())
    {
        // Process events
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
        }

		App.Clear();
		App.Draw(img.get_sprite(&quot;Unbenannt&quot;));
		App.Display();

	 }
	 _CrtDumpMemoryLeaks();
}
</code></pre>
<p>Ich kann das Leck einfach nicht finden!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247208</guid><dc:creator><![CDATA[Lecker]]></dc:creator><pubDate>Fri, 31 Aug 2012 03:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 08:05:03 GMT]]></title><description><![CDATA[<p>Visual Studio luegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247241</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 31 Aug 2012 08:05:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 08:06:44 GMT]]></title><description><![CDATA[<p>Lecker schrieb:</p>
<blockquote>
<p>Ich verwende &quot;crt dump memory leaks&quot; und versuche Speicherlecks zu finden.<br />
Es meldet bei diesem Programm welche:</p>
</blockquote>
<p>Meldet es auch, an welcher Stelle der Speicher geholt wurde? Gut möglich, dass da noch globale Objekte von den Bilbiotheken rumhängen, die erst nach dem Verlassen von main() gelöscht werden. Ein Profiler wird dir etwas mehr sagen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247243</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 31 Aug 2012 08:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 08:24:46 GMT]]></title><description><![CDATA[<p>Tatsächlich benutzt SFML einige globale Objekte (z.B. OpenGL-Context), welche erst nach dem Prüfen nach Memory Leaks zerstört werden.</p>
<p>Übrigens würde ich eher <code>std::runtime_error</code> statt <code>std::logic_error</code> verwenden, ausserdem empfehle ich Slashes statt Backslashes in Include-Pfaden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247254</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 31 Aug 2012 08:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 08:41:25 GMT]]></title><description><![CDATA[<p>Hier noch ein Memory Leak Detector für Visual Studio:<br />
<a href="http://vld.codeplex.com/" rel="nofollow">http://vld.codeplex.com/</a></p>
<p>Ev. kommen da andere Resultate dabei raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247260</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 31 Aug 2012 08:41:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 14:43:59 GMT]]></title><description><![CDATA[<p>Lecker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &quot;ImageManager.h&quot;

ImageManager::ImageManager(std::string rel_path) //const std::string &amp;
{

	boost::filesystem::path path(boost::filesystem::initial_path().string() + rel_path); //path hat einen operator / für so etwas, der das korrekt macht
	boost::filesystem::directory_iterator end;
	
	if ( boost::filesystem::is_directory(path) ) 
	{
		int size = 0; //size_t meinst du wohl
		for (boost::filesystem::directory_iterator iter(path); iter != end; ++iter)
			++size;

		images.reserve(size); //wozu? Das zusätzliche Iterieren über das Verzeichnis dauert vermutlich viel länger als das Reallozieren

		std::size_t i = 0; //ist das nötig?
		for (boost::filesystem::directory_iterator iter(path); iter != end; ++iter, ++i)
		{
			sf::Image temp;
			sf::Sprite sprite;
			if (temp.LoadFromFile(iter-&gt;path().string())) //Fehlerbehandlung?
			{
				images.push_back(temp);
				sprite.SetImage(images[i]); //meinst du vielleicht images.back() ?
				sprites[iter-&gt;path().stem().string()] = sprite;
			}
		}
	}
	else
	{
		throw(std::logic_error(&quot;File not found&quot;)); //welche Datei?
	}
}

sf::Sprite ImageManager::get_sprite(std::string name) //const std::string &amp;
{
	if (sprites.count(name))
		return sprites[name];
	else
		throw(std::logic_error(&quot;IMG not found&quot;));
}
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2247397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247397</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 31 Aug 2012 14:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 17:44:25 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Hier noch ein Memory Leak Detector für Visual Studio:<br />
<a href="http://vld.codeplex.com/" rel="nofollow">http://vld.codeplex.com/</a></p>
<p>Ev. kommen da andere Resultate dabei raus.</p>
</blockquote>
<p>Danke für den Tipp.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@Tyroxx</a><br />
Danke für die Tipps, diese Designfehler hab ich übersehen.<br />
Das mit dem reserve ist deswegen da, weil<br />
ein sf::Sprite eine Referenz auf ein sf::Image<br />
hat und bei Reallokation werden Referenzen<br />
kapputt.</p>
<p>Ich hab mir schon überlegt std::list<br />
oder boost::shared_array zu nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247462</guid><dc:creator><![CDATA[Lecker]]></dc:creator><pubDate>Fri, 31 Aug 2012 17:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Fri, 31 Aug 2012 19:54:45 GMT]]></title><description><![CDATA[<p>Lecker schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@Tyroxx</a><br />
Danke für die Tipps, diese Designfehler hab ich übersehen.<br />
Das mit dem reserve ist deswegen da, weil<br />
ein sf::Sprite eine Referenz auf ein sf::Image<br />
hat und bei Reallokation werden Referenzen<br />
kapputt.</p>
</blockquote>
<p><code>sf::Sprite</code> verwendest du falsch. Das erstellt man, wenn es benötigt wird und dann auch gerne mehrmals pro Bild.<br />
Außerdem: Wer sagt denn, dass der Iterator beide Male die gleichen Dateien auflistet? Die Anzahl kann sich doch jederzeit ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247495</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Sat, 01 Sep 2012 01:29:16 GMT]]></title><description><![CDATA[<p>Danke, das war mir nicht bewusst.<br />
Eine letzte Frage. Ich will die</p>
<pre><code>sf::Image
</code></pre>
<p>s als</p>
<pre><code class="language-cpp">const &amp;
</code></pre>
<p>zurückgeben:</p>
<pre><code class="language-cpp">const sf::Image &amp; ImageManager::getImage(const std::string &amp; name)
{
	if (images.count(name))
		return images[name];
	else
		throw(std::runtime_error(&quot;IMG not found&quot;));
}
</code></pre>
<p>Ist das gutes Design? Ich werd das ganze in eine andere Klasse packen und die Images werden nicht zerstört sein, bevor ich sie benutze.</p>
<p>PS: Der Visual Leak Detector erkennt keine Leaks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247548</guid><dc:creator><![CDATA[Lecker]]></dc:creator><pubDate>Sat, 01 Sep 2012 01:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Sat, 01 Sep 2012 03:34:13 GMT]]></title><description><![CDATA[<p>Lecker schrieb:</p>
<blockquote>
<p>Es meldet bei diesem Programm welche:<br />
(...)</p>
</blockquote>
<p>Guckst du (Kommentar im Code):</p>
<pre><code class="language-cpp">int main()
{
	ImageManager img(&quot;/img&quot;);
	sf::RenderWindow App(sf::VideoMode(800, 600, 32), &quot;Image Management Test&quot;);
	while (App.IsOpened())
	{
		// Process events
		sf::Event Event;
		while (App.GetEvent(Event))
		{
			// Close window : exit
			if (Event.Type == sf::Event::Closed)
				App.Close();
		}

		App.Clear();
		App.Draw(img.get_sprite(&quot;Unbenannt&quot;));
		App.Display();

	}
	// &quot;ImageManager img&quot; und &quot;sf::RenderWindow App&quot; sind hier noch im Scope,
	// wenn die dynamisch Speicher anfordern (wovon auszugehen ist),
	// dann ist es ganz normal dass _CrtDumpMemoryLeaks() Leaks melder
 	_CrtDumpMemoryLeaks();
}
</code></pre>
<p>Also besser so</p>
<pre><code class="language-cpp">int main()
{
	{
		ImageManager img(&quot;/img&quot;);
		sf::RenderWindow App(sf::VideoMode(800, 600, 32), &quot;Image Management Test&quot;);

		while (App.IsOpened())
			...
	}

 	_CrtDumpMemoryLeaks();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2247551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247551</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 01 Sep 2012 03:34:13 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Sat, 01 Sep 2012 03:50:20 GMT]]></title><description><![CDATA[<p>Nochwas...</p>
<p><code>sf::Sprite</code> merkt sich einen Zeiger auf das <code>sf::Image</code> .<br />
Die Adresse des <code>sf::Image</code> darf sich also nicht ändern.<br />
Tut sie aber, wenn du die <code>sf::Image</code> Instanzen in einem <code>std::vector</code> verwaltest, und neue Bilder hinzufügst.</p>
<p>Wenn du die Bilder immer im Konstruktor lädst, und danach keine weiteren mehr hinzufügst, dann ist das OK.<br />
Wenn du aber Bilder hinzufügst nachdem <code>get_sprite</code> aufgerufen wurde, dann kannst du da ein Problem bekommen.</p>
<p>------------</p>
<blockquote>
<pre><code class="language-cpp">const sf::Image &amp; ImageManager::getImage(const std::string &amp; name)
...
</code></pre>
<p>Ist das gutes Design? Ich werd das ganze in eine andere Klasse packen und die Images werden nicht zerstört sein, bevor ich sie benutze.</p>
</blockquote>
<p>Och da kann man vermutlich ganz unterschiedlicher Meinung sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich finde es komisch.<br />
Und zwar weil <code>sf::Image</code> in dieser Anwendung nicht &quot;Wert-Semantik&quot; hat, sondern &quot;Objekt-Semantik&quot; (heisst: die Adresse der <code>sf::Image</code> Dinger ist relevant).<br />
In so einem Fall würde ich eher nen Zeiger zurückgeben. Referenz finde ich da einfach komisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247553</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 01 Sep 2012 03:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Sat, 01 Sep 2012 04:09:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<pre><code class="language-cpp">const sf::Image &amp; ImageManager::getImage(const std::string &amp; name)
...
</code></pre>
<p>Ist das gutes Design? Ich werd das ganze in eine andere Klasse packen und die Images werden nicht zerstört sein, bevor ich sie benutze.</p>
</blockquote>
<p>Och da kann man vermutlich ganz unterschiedlicher Meinung sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich finde es komisch.<br />
Und zwar weil <code>sf::Image</code> in dieser Anwendung nicht &quot;Wert-Semantik&quot; hat, sondern &quot;Objekt-Semantik&quot; (heisst: die Adresse der <code>sf::Image</code> Dinger ist relevant).<br />
In so einem Fall würde ich eher nen Zeiger zurückgeben. Referenz finde ich da einfach komisch.</p>
</blockquote>
<p>Toll: Schnittstelle aufgeweicht, nur um einen seltenen Fehler zu erschweren.<br />
Wer mit der Referenz das Objekt kopiert, bekommt dieses Kunststück auch mit einem Zeiger hin.<br />
Und die Verwirrung, weil auf einmal manche Zeiger Null sein können und andere nicht, gibts gratis dazu.</p>
<p>Referenz ist da völlig in Ordnung. Wenn eine Funktion eine Referenz zurückgibt, ist schon klar, dass da keine Wertsemantik vorliegt. Kann aber noch einmal dabeistehen.</p>
<p>Nochmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> für die Verwendung von Boost, <code>std</code> , <code>const</code> und Referenzen. Das ist selten bei Fragenden hier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247556</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 01 Sep 2012 04:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Sat, 01 Sep 2012 04:48:28 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Hier noch ein Memory Leak Detector für Visual Studio:<br />
<a href="http://vld.codeplex.com/" rel="nofollow">http://vld.codeplex.com/</a></p>
<p>Ev. kommen da andere Resultate dabei raus.</p>
</blockquote>
<blockquote>
<p>Then it can be used with any C/C++ project simply by adding the following line to your code:<br />
#include &lt;vld.h&gt;</p>
</blockquote>
<p>Ist das egal, wo man vld.h inkludiert? Geht das auch wenn das Programm aus mehreren Projekten/DLLs besteht oder muss man in jedem Projekt vld.h inkludieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247558</guid><dc:creator><![CDATA[nefrage]]></dc:creator><pubDate>Sat, 01 Sep 2012 04:48:28 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherleck on Sat, 01 Sep 2012 09:05:34 GMT]]></title><description><![CDATA[<p>nefrage schrieb:</p>
<blockquote>
<p>Ist das egal, wo man vld.h inkludiert? Geht das auch wenn das Programm aus mehreren Projekten/DLLs besteht oder muss man in jedem Projekt vld.h inkludieren?</p>
</blockquote>
<p>1. Ja<br />
2. Die Datei muss einmal pro EXE/DLL includiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247580</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 01 Sep 2012 09:05:34 GMT</pubDate></item></channel></rss>