<?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[Exceptionsicherer Code]]></title><description><![CDATA[<p>Ich beschäftige mich derzeit mit OpenGL und implementiere dort einen Shader.<br />
Der Code zum Einlesen der Quelldatei ist folgender:</p>
<pre><code class="language-cpp">vector&lt;string&gt; LineBuffer;
	while (File) {
		string Line;
		getline(File, Line);
		LineBuffer.push_back(Line);
	}
	if (File.bad())
		throw runtime_error(&quot;Couldn't read shader&quot;);

	size_t Size = LineBuffer.size();
	const GLchar** CArray = new const GLchar*[Size];
	for (int i = 0; i != Size; ++i)
		CArray[i] = LineBuffer[i].c_str();

	// Set shader source
	glShaderSource(ShaderObject, Size, CArray, nullptr);

	// Free char arrays
	delete[] CArray;
</code></pre>
<p>Ist irgendwie nicht sonderlich schön - funktioniert aber.<br />
Wie kann ich das eleganter und vor allem exceptionsicher machen?</p>
<p>An glShaderSource muss ein Zeiger auf ein Array von Size null-terminierten C-Strings übergeben werden.</p>
<p>Wenn im aktuellen Code nach Zeile 11 eine Exception fliegen würde, hätte man ein Speicherleck. Kann man das irgendwie verhindern?</p>
<p>Gruß,<br />
Qwert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262996/exceptionsicherer-code</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 05:55:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262996.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 14 Mar 2010 16:32:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 16:32:31 GMT]]></title><description><![CDATA[<p>Ich beschäftige mich derzeit mit OpenGL und implementiere dort einen Shader.<br />
Der Code zum Einlesen der Quelldatei ist folgender:</p>
<pre><code class="language-cpp">vector&lt;string&gt; LineBuffer;
	while (File) {
		string Line;
		getline(File, Line);
		LineBuffer.push_back(Line);
	}
	if (File.bad())
		throw runtime_error(&quot;Couldn't read shader&quot;);

	size_t Size = LineBuffer.size();
	const GLchar** CArray = new const GLchar*[Size];
	for (int i = 0; i != Size; ++i)
		CArray[i] = LineBuffer[i].c_str();

	// Set shader source
	glShaderSource(ShaderObject, Size, CArray, nullptr);

	// Free char arrays
	delete[] CArray;
</code></pre>
<p>Ist irgendwie nicht sonderlich schön - funktioniert aber.<br />
Wie kann ich das eleganter und vor allem exceptionsicher machen?</p>
<p>An glShaderSource muss ein Zeiger auf ein Array von Size null-terminierten C-Strings übergeben werden.</p>
<p>Wenn im aktuellen Code nach Zeile 11 eine Exception fliegen würde, hätte man ein Speicherleck. Kann man das irgendwie verhindern?</p>
<p>Gruß,<br />
Qwert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868884</guid><dc:creator><![CDATA[Qwert Zuiopü]]></dc:creator><pubDate>Sun, 14 Mar 2010 16:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 16:38:33 GMT]]></title><description><![CDATA[<p>Qwert Zuiopü schrieb:</p>
<blockquote>
<p>Wenn im aktuellen Code nach Zeile 11 eine Exception fliegen würde, hätte man ein Speicherleck. Kann man das irgendwie verhindern?</p>
</blockquote>
<p>try/catch um den Code der werfen kann, und dann einfach die exception wieder werfen:</p>
<pre><code class="language-cpp">vector&lt;string&gt; LineBuffer;
    while (File) {
        string Line;
        getline(File, Line);
        LineBuffer.push_back(Line);
    }
    if (File.bad())
        throw runtime_error(&quot;Couldn't read shader&quot;);

    size_t Size = LineBuffer.size();
    const GLchar** CArray = new const GLchar*[Size];
    try {
        for (int i = 0; i != Size; ++i)
            CArray[i] = LineBuffer[i].c_str();

        // Set shader source
        glShaderSource(ShaderObject, Size, CArray, nullptr);

        // Free char arrays
    } catch(...) {
        delete[] CArray;
        throw;
    }
    delete[] CArray;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1868887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868887</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 14 Mar 2010 16:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 16:48:02 GMT]]></title><description><![CDATA[<p>Es kann so einfach sein.<br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868894</guid><dc:creator><![CDATA[Qwert Zuiopü]]></dc:creator><pubDate>Sun, 14 Mar 2010 16:48:02 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 17:23:36 GMT]]></title><description><![CDATA[<p>Oder man verwendet Smart-Pointers, bzw. RAII.</p>
<pre><code class="language-cpp">#include &lt;boost/scoped_array.hpp&gt;

// ...

    vector&lt;string&gt; LineBuffer;
    while (File) {
        string Line;
        getline(File, Line);
        LineBuffer.push_back(Line);
    }
    if (File.bad())
        throw runtime_error(&quot;Couldn't read shader&quot;);

    size_t Size = LineBuffer.size();
    boost::scoped_array&lt;const GLchar*&gt; CArray(new const GLchar*[Size]);

    for (int i = 0; i != Size; ++i)
        CArray[i] = LineBuffer[i].c_str();

    // Set shader source
    glShaderSource(ShaderObject, Size, CArray, nullptr);
</code></pre>
<p>Sowas sollte man wenn möglich immer einsetzen. Man kann dann auch nicht vergessen <code>delete</code> aufzurufen, da es automatisch passiert.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868913</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 14 Mar 2010 17:23:36 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 17:25:19 GMT]]></title><description><![CDATA[<p>Oder du nimmst Smart Pointer, damit sparst du dir den Extra try/catch Block.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868914</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Sun, 14 Mar 2010 17:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 18:54:28 GMT]]></title><description><![CDATA[<p>Oder man nimmt einfach einen normalen vector <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<pre><code class="language-cpp">// ...

    vector&lt;string&gt; LineBuffer;
    while (File) {
        string Line;
        getline(File, Line);
        LineBuffer.push_back(Line);
    }
    if (File.bad())
        throw runtime_error(&quot;Couldn't read shader&quot;);

    size_t Size = LineBuffer.size();
    std::vector&lt;GLchar const*&gt; CArray(Size, 0);

    for (int i = 0; i != Size; ++i) {
        CArray[i] = LineBuffer[i].c_str();
    }

    // Set shader source
    glShaderSource(ShaderObject, Size, &amp;CArray[0], nullptr);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1868953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868953</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sun, 14 Mar 2010 18:54:28 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptionsicherer Code on Sun, 14 Mar 2010 19:21:37 GMT]]></title><description><![CDATA[<p>xD</p>
<p>Das geht natürlich auch. Wie hieß es noch gleich in dem Sprichwort mit dem Wald und den Bäumen?</p>
<p>Danke für die Antworten.<br />
Gruß,<br />
Qwert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1868963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1868963</guid><dc:creator><![CDATA[Qwert Zuiopü]]></dc:creator><pubDate>Sun, 14 Mar 2010 19:21:37 GMT</pubDate></item></channel></rss>