<?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[Hab ich hier eventuell etwas nicht berücksichtigt?]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>Ich benötige eine Bestätigung, dass ich nicht den totalen Mist verbrochen habe. Es geht um folgendes:</p>
<p>Ich habe mehrere Funktionen bei denen ich einen Speicherbereich zurückgebe, die Größe dabei ist variabel. Etwa so:</p>
<pre><code>Pseudocode: (syntaktisch falsch)
char* Funktion()
{
char* buffer = new char* [20]
buffer = &quot;Bla bla bla&quot;
return buffer
}
</code></pre>
<p>Mir ist dabei klar, dass der Speicher nicht freigegeben wird und somit verfault. Das soll nicht sein, daher habe ich mir eine Methode überlegt, mit der ich der Funktion ein Objekt übergebe welches einen pointer enthält. Dann kann die Funktion den Pointer manipulieren wie sie will und Dinge hinein schreiben. Wenn das Objekt dann aus dem Scope fällt und der destruktor aufgerufen wird, wird der allokierte Speicher freigegeben. Das Objekt soll aber nicht innerhalb der Funktion erzeugt werden da der Speicher dann bei dem Rückgabewert der Funktion schon freigegeben werden würde. Das Objekt mit dem Pointer wird also im Hauptcode erstellt, von dem aus dann die Funktion aufgerufen wird.</p>
<p>Das sieht dann so aus:</p>
<pre><code>Pseudocode: (syntaktisch falsch)
char* Funktion( object_klasse &amp;name)
{
name = new char* [20]
name = &quot;Bla bla bla&quot;
return name
}

Hauptcode:
{
object_klasse xyz   //objekt mit pointer erstellen
cout&lt;&lt;Funktion( xyz )&lt;&lt;endl
} //hier wird der Speicher im Pointer mittels Destruktor des Objekts freigegeben
</code></pre>
<p>Ich hoffe es ist klar wie ich das meine. Der Pointer wird praktisch vor der Funktion außerhalb im Hauptcode erzeugt (in einem Objekt) und dann übergeben an die Funktion. Die Funktion schreibt ihre Werte rein und gibts zurück. (Dabei wird das Objekt direkt als Referenz benutzt und KEINE Kopie des Objekts).</p>
<p>Als richtiger Code nun sieht das so aus:</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

class pointer_class
{
private:    int size;
public:     char* pointer;
            bool change_size(int new_size, bool flag = false);      //Used to reallocate new memory //true = save old content //false = clear all
            bool write( char*, int = -1);
            pointer_class( int );
            ~pointer_class( void );
};

bool pointer_class::write( char* new_content, int length)
{
    if (length == -1)
    {
        length = strlen( new_content );
    }
    if (length &lt;= size)     //only if pointer is holding enough memory
    {
        memcpy(pointer, new_content, length);
        return true;
    }
    return false;
}

bool pointer_class::change_size(int new_size, bool flag)
{
    //flag true = keep content
    //flag false = clear content

    if (flag == true)       //keep content
    {
        if (size &gt; 0)
        {
            char* old_content = new char [size];        //allocate memory for old content to keep it
            memcpy(old_content, pointer, size);         //save old content
            delete [] pointer;                          //delete pointer for reallocating soon with new size
            pointer = new char [new_size];              //allocate new memory
            memset(pointer, 0, new_size);               //set all to zero
            memcpy(pointer, old_content, new_size);     //fill in old memory till end of new buffer or till everything is in
            delete [] old_content;                      //delete temporary buffer for old content;
            size = new_size;                            //set new size
            return true;
        }

        pointer = new char [new_size];
        memset(pointer, 0, new_size);
        size = new_size;
        return true;
    }
    else        //clear content
    {
        if (size &gt; 0)
        {
            delete [] pointer;
        }
        pointer = new char [new_size];
        memset(pointer, 0, new_size);
        size = new_size;
        return true;
    }
    return false;
}

pointer_class::pointer_class( int p_size)
{
    if (p_size != -1)
    {
        pointer = new char [size];
        memset(pointer, 0, size);
        size = p_size;
    }
    else
    {
        pointer = NULL;
        size = 0;
    }
}

pointer_class::~pointer_class( void )
{
    if (size &gt; 0)
    {
        delete [] pointer;
    }
}

char* testfunction( pointer_class &amp;ext_buffer)
{
    ext_buffer.change_size(4096);       //change size of buffer and zero everything
    memcpy(ext_buffer.pointer, &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;, strlen(&quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;));        //set zero for testing

    return ext_buffer.pointer;
}

int main()
{
    pointer_class buffer(-1);
    cout&lt;&lt;testfunction(buffer)&lt;&lt;endl;
    cin.get();

    return 0;
}
</code></pre>
<p>Mir ist bewusst, ich begehe da schwere OOP-Fehler da der Pointer im Public bereich ist und somit frei manipuliert werden kann. Doch anders lässt es sich manchmal nicht machen (da manche WinAPI-Funktionen den reichen Pointer als Parameter benötigen und wenn der geschützt ist die Funktion einen Zugriffsfehler rausgibt). Daher brauche ich manchmal den ungeschützten reinen pointer aus dem Objekt welcher deshalb public ist.</p>
<p>Das Ganze wird eine recht komplexe Änderung in meinem Programm werden daher würde ich gern vorher wissen, ob der Code so korrekt ist. Es gibt bei mir keine Fehlermeldungen.<br />
Wichtig ist, dass keinerlei Dinge im Speicher vergessen werden und keine Zugriffsfehler oder Ähnliches auftreten.<br />
Wär' also nett wenn sich ein Kundiger mal den Code ansehen könnte und schaut ob alles ok soweit ist. Wie gesagt, das wären recht große Einschnitte wenn ich den Code einbaue, dann sollte er auch gehen. Nicht, dass später bei längerer Benutzung Speicherlöcher auftreten die dann schwere Fehler verursachen.</p>
<p>mfg</p>
<p>Ynnus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/122330/hab-ich-hier-eventuell-etwas-nicht-berücksichtigt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 01:41:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/122330.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Oct 2005 20:02:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:02:26 GMT]]></title><description><![CDATA[<p>Hallöchen,</p>
<p>Ich benötige eine Bestätigung, dass ich nicht den totalen Mist verbrochen habe. Es geht um folgendes:</p>
<p>Ich habe mehrere Funktionen bei denen ich einen Speicherbereich zurückgebe, die Größe dabei ist variabel. Etwa so:</p>
<pre><code>Pseudocode: (syntaktisch falsch)
char* Funktion()
{
char* buffer = new char* [20]
buffer = &quot;Bla bla bla&quot;
return buffer
}
</code></pre>
<p>Mir ist dabei klar, dass der Speicher nicht freigegeben wird und somit verfault. Das soll nicht sein, daher habe ich mir eine Methode überlegt, mit der ich der Funktion ein Objekt übergebe welches einen pointer enthält. Dann kann die Funktion den Pointer manipulieren wie sie will und Dinge hinein schreiben. Wenn das Objekt dann aus dem Scope fällt und der destruktor aufgerufen wird, wird der allokierte Speicher freigegeben. Das Objekt soll aber nicht innerhalb der Funktion erzeugt werden da der Speicher dann bei dem Rückgabewert der Funktion schon freigegeben werden würde. Das Objekt mit dem Pointer wird also im Hauptcode erstellt, von dem aus dann die Funktion aufgerufen wird.</p>
<p>Das sieht dann so aus:</p>
<pre><code>Pseudocode: (syntaktisch falsch)
char* Funktion( object_klasse &amp;name)
{
name = new char* [20]
name = &quot;Bla bla bla&quot;
return name
}

Hauptcode:
{
object_klasse xyz   //objekt mit pointer erstellen
cout&lt;&lt;Funktion( xyz )&lt;&lt;endl
} //hier wird der Speicher im Pointer mittels Destruktor des Objekts freigegeben
</code></pre>
<p>Ich hoffe es ist klar wie ich das meine. Der Pointer wird praktisch vor der Funktion außerhalb im Hauptcode erzeugt (in einem Objekt) und dann übergeben an die Funktion. Die Funktion schreibt ihre Werte rein und gibts zurück. (Dabei wird das Objekt direkt als Referenz benutzt und KEINE Kopie des Objekts).</p>
<p>Als richtiger Code nun sieht das so aus:</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

class pointer_class
{
private:    int size;
public:     char* pointer;
            bool change_size(int new_size, bool flag = false);      //Used to reallocate new memory //true = save old content //false = clear all
            bool write( char*, int = -1);
            pointer_class( int );
            ~pointer_class( void );
};

bool pointer_class::write( char* new_content, int length)
{
    if (length == -1)
    {
        length = strlen( new_content );
    }
    if (length &lt;= size)     //only if pointer is holding enough memory
    {
        memcpy(pointer, new_content, length);
        return true;
    }
    return false;
}

bool pointer_class::change_size(int new_size, bool flag)
{
    //flag true = keep content
    //flag false = clear content

    if (flag == true)       //keep content
    {
        if (size &gt; 0)
        {
            char* old_content = new char [size];        //allocate memory for old content to keep it
            memcpy(old_content, pointer, size);         //save old content
            delete [] pointer;                          //delete pointer for reallocating soon with new size
            pointer = new char [new_size];              //allocate new memory
            memset(pointer, 0, new_size);               //set all to zero
            memcpy(pointer, old_content, new_size);     //fill in old memory till end of new buffer or till everything is in
            delete [] old_content;                      //delete temporary buffer for old content;
            size = new_size;                            //set new size
            return true;
        }

        pointer = new char [new_size];
        memset(pointer, 0, new_size);
        size = new_size;
        return true;
    }
    else        //clear content
    {
        if (size &gt; 0)
        {
            delete [] pointer;
        }
        pointer = new char [new_size];
        memset(pointer, 0, new_size);
        size = new_size;
        return true;
    }
    return false;
}

pointer_class::pointer_class( int p_size)
{
    if (p_size != -1)
    {
        pointer = new char [size];
        memset(pointer, 0, size);
        size = p_size;
    }
    else
    {
        pointer = NULL;
        size = 0;
    }
}

pointer_class::~pointer_class( void )
{
    if (size &gt; 0)
    {
        delete [] pointer;
    }
}

char* testfunction( pointer_class &amp;ext_buffer)
{
    ext_buffer.change_size(4096);       //change size of buffer and zero everything
    memcpy(ext_buffer.pointer, &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;, strlen(&quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;));        //set zero for testing

    return ext_buffer.pointer;
}

int main()
{
    pointer_class buffer(-1);
    cout&lt;&lt;testfunction(buffer)&lt;&lt;endl;
    cin.get();

    return 0;
}
</code></pre>
<p>Mir ist bewusst, ich begehe da schwere OOP-Fehler da der Pointer im Public bereich ist und somit frei manipuliert werden kann. Doch anders lässt es sich manchmal nicht machen (da manche WinAPI-Funktionen den reichen Pointer als Parameter benötigen und wenn der geschützt ist die Funktion einen Zugriffsfehler rausgibt). Daher brauche ich manchmal den ungeschützten reinen pointer aus dem Objekt welcher deshalb public ist.</p>
<p>Das Ganze wird eine recht komplexe Änderung in meinem Programm werden daher würde ich gern vorher wissen, ob der Code so korrekt ist. Es gibt bei mir keine Fehlermeldungen.<br />
Wichtig ist, dass keinerlei Dinge im Speicher vergessen werden und keine Zugriffsfehler oder Ähnliches auftreten.<br />
Wär' also nett wenn sich ein Kundiger mal den Code ansehen könnte und schaut ob alles ok soweit ist. Wie gesagt, das wären recht große Einschnitte wenn ich den Code einbaue, dann sollte er auch gehen. Nicht, dass später bei längerer Benutzung Speicherlöcher auftreten die dann schwere Fehler verursachen.</p>
<p>mfg</p>
<p>Ynnus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885150</guid><dc:creator><![CDATA[Ynnus]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:02:26 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:15:07 GMT]]></title><description><![CDATA[<p>mal davon abgesehen, daß dein code so grottenschlecht ist, daß sich mir die zehnägel kräuseln, scheint er korrekt zu sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/885165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885165</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:17:25 GMT]]></title><description><![CDATA[<p>Lern C++. Im Moment programmierst du C/C++. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/885167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885167</guid><dc:creator><![CDATA[volkrad]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:17:25 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:22:39 GMT]]></title><description><![CDATA[<p>volkrad hat recht. Außerdem würde ich den pointer wohl durch ein to_raw_pointer() methode ersetzen.<br />
Btw: Das nennst sich smart pointer, kannst ja mal danach googlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885170</guid><dc:creator><![CDATA[ness]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:26:46 GMT]]></title><description><![CDATA[<p>das ist schon realesiert und heißt std::vector</p>
<pre><code class="language-cpp">const char * testFunction(std::vector&lt;char&gt; &amp;buffer)
{	
	const char *str = &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;;
	size_t len = strlen(str);	
	buffer.assign(str, str + len + 1);//including the terminal NULL
	return &amp;buff[0];
}

int main() 
{ 
	std::vector&lt;char&gt; buffer;
	cout &lt;&lt; testfunction(buffer)-&gt;c_str() &lt;&lt; endl; 
	cin.get(); 
	return 0; 
}
</code></pre>
<p>das geht aber einfacher mit std::string</p>
<pre><code class="language-cpp">const std::string testFunction()
{
	std::string result = &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;;
	return result;
}

int main() 
{ 
	cout &lt;&lt; testFunction().c_str() &lt;&lt; endl; 
	cin.get(); 

	return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/885175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885175</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:30:49 GMT]]></title><description><![CDATA[<p>ness schrieb:</p>
<blockquote>
<p>Btw: Das nennst sich smart pointer, kannst ja mal danach googlen.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>nennt sich std::vector dann auch &quot;smart pointer&quot; ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/885184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885184</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:42:37 GMT]]></title><description><![CDATA[<blockquote>
<pre><code>const char * testFunction(std::vector&lt;char&gt; &amp;buffer)
{   
    const char *str = &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;;
    size_t len = strlen(str);   
    buffer.assign(str, str + len + 1);//including the terminal NULL
    return &amp;buff[0];
}

int main()
{
    std::vector&lt;char&gt; buffer;
    cout &lt;&lt; testfunction(buffer)-&gt;c_str() &lt;&lt; endl;
    cin.get();
    return 0;
}
</code></pre>
</blockquote>
<p>Wenn ich das so sehen sieht das so ähnlich aus wie die Methode die ich verwende. Nur, dass ich eben meine eigene Klasse erstelle die den Speicher managed. Abgesehen davon, dass euch mein C/C++ Stil nicht gefällt, wenn's sich ohne Speicherlöcher so machen lässt, wär' mir das schon recht.<br />
Die C++ Umsetzungen mit Vector und String-Klasse könnte ich mir ja auch mal zu Gemüt führen aber im Moment gefällt es mir so (umständlich) noch ganz gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885190</guid><dc:creator><![CDATA[Ynnus]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:42:37 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:45:34 GMT]]></title><description><![CDATA[<p>Ynnus schrieb:</p>
<blockquote>
<p>Die C++ Umsetzungen mit Vector und String-Klasse könnte ich mir ja auch mal zu Gemüt führen aber im Moment gefällt es mir so (umständlich) noch ganz gut.</p>
</blockquote>
<p>Musst du das Rad unbedingt neu erfinden ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885193</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:46:21 GMT]]></title><description><![CDATA[<p>Offensichtlich sollte das eine klasse sein in der du c-strings oder auch irgendwelche anderen daten speichern willst. Wenn das so ist dann solltest du die länge der gültigen daten ( falls kein c-string ) speichern.</p>
<pre><code class="language-cpp">bool pointer_class::write( char* new_content, int length)
{
    if (length == -1)
    {
        length = strlen( new_content ); // du hast das \0 am ende vergessen
                                        // warum kopierst du hier nicht ??
    }
    if (length &lt;= size)     //only if pointer is holding enough memory
    {
        memcpy(pointer, new_content, length); 
        return true;
    }
    // wenn length &gt;= size warum rufst du nicht gleich change_size auf ??
    return false;
}
</code></pre>
<p>Ich würde pointer trotzdem nicht public machen und eine getter function schreiben<br />
zb.</p>
<pre><code class="language-cpp">char * get_pointer() { return pointer; }
</code></pre>
<p>Denn sonst könnte man irrtümlicherweise den pointer von ausserhalb der klasse überschreiben.<br />
deine testfunction() müsste dann so aussehen:</p>
<pre><code class="language-cpp">char* testfunction( pointer_class &amp;ext_buffer){
    ext_buffer.change_size(4096);       //change size of buffer and zero everything
//    memcpy(ext_buffer.pointer, &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;, strlen(&quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;));        //set zero for testing
// wozu hast du die write function ??
    ext_buffer.write( &quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;, strlen(&quot;DIES IST DER NEUE INHALT DES SPEICHERBEREICHS&quot;));        
    return ext_buffer.get_pointer();
}
</code></pre>
<p>Kurt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885195</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:46:21 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 23:37:28 GMT]]></title><description><![CDATA[<p>Ynnus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Pseudocode: (syntaktisch falsch) // schon mal ganz schlecht
char* Funktion()
{
char* buffer = new char* [20] // das verwirrt nur, deshalb immer richtig schreiben
buffer = &quot;Bla bla bla&quot; // std::strncpy nehmen
return buffer
}
</code></pre>
<p>Mir ist dabei klar, dass der Speicher nicht freigegeben wird und somit verfault. Das soll nicht sein, daher habe ich mir eine Methode überlegt, mit der ich der Funktion ein Objekt übergebe welches einen pointer enthält. Dann kann die Funktion den Pointer manipulieren wie sie will und Dinge hinein schreiben. Wenn das Objekt dann aus dem Scope fällt und der destruktor aufgerufen wird, wird der allokierte Speicher freigegeben.</p>
</blockquote>
<p>Richtig. Gute Idee.</p>
<blockquote>
<p>Das Objekt soll aber nicht innerhalb der Funktion erzeugt werden da der Speicher dann bei dem Rückgabewert der Funktion schon freigegeben werden würde. Das Objekt mit dem Pointer wird also im Hauptcode erstellt, von dem aus dann die Funktion aufgerufen wird.</p>
</blockquote>
<p>Du musst einen Copyconstructor und einen operator= definieren.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class pointer_class // Klassennamen werden meist groß geschrieben
{
private:    int size; // sollte size_t sein, weil z.b. strlen auch mit size_t arbeiten
            char* pointer; // siehe data()
public:     
            const char* getData() const { return pointer; } // edit: es sollte getData und nicht nur &quot;data&quot; heißen
            bool change_size(int new_size, bool flag = false); 
// die funktionen von variablen sollten durch den namen erkennbar sein
// vielleicht solltest du dich entscheiden, ob du minimale prototypen schreibst, oder immer gleich die namen mit angibst
            bool write( char*, int = -1);
            pointer_class( int );
            ~pointer_class( void ); // void muss nur in c da stehen
};

bool pointer_class::write( char* new_content, int length)
{
    if (length == -1)
    {
        length = strlen( new_content );
    }
    if (length &lt;= size)     //only if pointer is holding enough memory
    {
        std::strcpy(pointer, new_content); // strcpy, weil das ziel groß genug ist
        return true;
    }
    return false;
}

bool pointer_class::change_size(int new_size, bool flag)
{
    //flag true = keep content
    //flag false = clear content

    if (flag)       
    {
        if (size &gt; 0)
        {
/*
            char* old_content = new char [size];        //allocate memory for old content to keep it
            memcpy(old_content, pointer, size);         // hier wieder dasselbe mit std::strcpy
            delete [] pointer;                          //delete pointer for reallocating soon with new size
            pointer = new char [new_size];              //allocate new memory
            memset(pointer, 0, new_size);               //unnötig, wird sowieso gleich überschrieben
            memcpy(pointer, old_content, new_size);     //fill in old memory till end of new buffer or till everything is in
            delete [] old_content;                      //delete temporary buffer for old content;
            size = new_size;                            //set new size
            return true;
*/
           char* content = new char[new_size];
           std::strncpy(content, pointer, new_size);
           delete [] pointer;
           pointer = content;
        }
        else
        {
           pointer = new char [new_size];
           memset(pointer, 0, new_size);
        }
        size = new_size;
        return true;
    }
    else        //clear content
    {
        if (size &gt; 0)
            delete [] pointer;
        pointer = new char [new_size];
        memset(pointer, 0, new_size);
        size = new_size;
        return true;
    }
    return false;
}

// lieber zwei Konstruktoren nehmen, einer mit size_t und einer ohne argumente
pointer_class::pointer_class( int p_size) :
size(p_size) // ist in mehr als 50% der fälle richtig
{
    if (p_size &gt; -1) // wir wollen schließlich keine ungültigen argumente für new
    {
        pointer = new char [size];
        memset(pointer, 0, size);
    }
    else
    {
        pointer = 0; // NULL ist deprecated (oder so)
        size = 0;
    }
}

pointer_class::~pointer_class( void )
{
    if (size)
        delete [] pointer;
}
</code></pre>
<blockquote>
<p>Mir ist bewusst, ich begehe da schwere OOP-Fehler da der Pointer im Public bereich ist und somit frei manipuliert werden kann. Doch anders lässt es sich manchmal nicht machen (da manche WinAPI-Funktionen den reichen Pointer als Parameter benötigen und wenn der geschützt ist die Funktion einen Zugriffsfehler rausgibt). Daher brauche ich manchmal den ungeschützten reinen pointer aus dem Objekt welcher deshalb public ist.</p>
</blockquote>
<p>Schau dir mal <a href="http://cppreference.com/cppstring/data.html" rel="nofollow">std::string::data()</a> und <a href="http://cppreference.com/cppstring/c_str.html" rel="nofollow">std::string::c_str()</a> an.</p>
<p>Ansonsten ist grundsätzlich von ungeschütztem Datenverkehr abzuraten.</p>
<p>Das sah eigentlich alles richtig aus, habe es aber nicht compiliert.<br />
Sieh das aber nur als Übung an und benutze ansonsten immer std::string.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885197</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Tue, 04 Oct 2005 23:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:49:39 GMT]]></title><description><![CDATA[<p>Wenn du weiter so programmierst wird dein Programm aber nicht gut!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885200</guid><dc:creator><![CDATA[h.]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:49:39 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 20:50:45 GMT]]></title><description><![CDATA[<p>ness schrieb:</p>
<blockquote>
<p>Btw: Das nennst sich smart pointer, kannst ja mal danach googlen.</p>
</blockquote>
<p>Da wird zwar auch Speicher freigegeben, aber das hier ist immer noch ein Container und ein std::string/vector&lt;char&gt; Ersatz.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885202</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Tue, 04 Oct 2005 20:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 21:01:47 GMT]]></title><description><![CDATA[<p>terraner schrieb:</p>
<blockquote>
<p>Du musst einen Copyconstructor und einen operator= definieren.</p>
</blockquote>
<p>oder deine Klasse von boost::noncopyable erben lassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885212</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Tue, 04 Oct 2005 21:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 21:03:56 GMT]]></title><description><![CDATA[<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9438">@Ynnus</a></strong><br />
ich würde dir auch raten, dich mit den stl-klassen vector und string zu befassen. das ist zwar erst mal ein gewisser lernaufwand, der zahlt sich aber in jedem fall aus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885213</guid><dc:creator><![CDATA[Konfusius]]></dc:creator><pubDate>Tue, 04 Oct 2005 21:03:56 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 21:49:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn du weiter so programmierst wird dein Programm aber nicht gut!</p>
</blockquote>
<p>Ok, ich hab ja schon verstanden, dass ich das nur unnötig kompliziert mache und besser auf vorhandene C++ Klassen zurückgreifen. Aber mal ganz unabhängig vom Gefallen am Programmierstil, solange keine Fehler drinne sind, hat es doch keine Auswirkungen darauf, wie gut das Programm wird.<br />
Vielleicht darauf, dass es ein bisschen mehr Rechenleistung benötigt oder weniger Schleifendurchläufe pro Sekunde hinlegt. Aber sonst hat doch der Stil des Programmes wenig Auswirkungen auf das Resultat.<br />
Wo genau ist denn der Knackpunkt (außer, dass ich C unc C++ mische) der das Programm so schlecht macht? Irgendwelche groben Verstöße beim Speichermanagement? Und das Variablen mal public sind lässt sich manchmal leider (scheinbar?) nicht umgehen. Beispiel: Die WinAPI benötigt des öffteren einen Speicherbereich um dort Werte hinein zu schreiben. Wenn ich nun den Pointer im Private Bereich des Objekts habe, wie kann ich den dann übergeben? Dann wird mir das Programm wohl mit einem Schreibsfehler abschmieren weil jemand in den Private-Bereich eines Objekts schreiben wollte. Oder gibt es da mir unbekannte Möglichkeiten, doch in die Private Variablen zu schreiben von Außerhalb? Ist ja auch nicht Sinn von OOP, daher hab ich die Variable gleich public gesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885225</guid><dc:creator><![CDATA[Ynnus]]></dc:creator><pubDate>Tue, 04 Oct 2005 21:49:59 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 21:59:41 GMT]]></title><description><![CDATA[<p>was spricht gegen eine get-memberfunktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885228</guid><dc:creator><![CDATA[public var]]></dc:creator><pubDate>Tue, 04 Oct 2005 21:59:41 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 22:02:32 GMT]]></title><description><![CDATA[<p>public var schrieb:</p>
<blockquote>
<p>was spricht gegen eine get-memberfunktion?</p>
</blockquote>
<p>Ist der Private-Breich eines Objekts nicht in so fern geschützt, dass man Veränderungen NUR innerhalb der Klasse und deren Methoden vornehmen kann? Selbst wenn ich dann den Pointer per return zurückgebe und an die WinAPI-Funktion übergebe, sobald die Funktion den Inhalt ändern will, stürzt das Programm ab. Oder liege ich da falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885229</guid><dc:creator><![CDATA[Ynnus]]></dc:creator><pubDate>Tue, 04 Oct 2005 22:02:32 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 22:08:52 GMT]]></title><description><![CDATA[<p>Liegst falsch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885231</guid><dc:creator><![CDATA[hahahahahah]]></dc:creator><pubDate>Tue, 04 Oct 2005 22:08:52 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 22:20:06 GMT]]></title><description><![CDATA[<p>Ich bin ja froh, dass einige hier so humorvoll sind. Hast du keinen Nick oder wie?</p>
<p>Ich hab's jetzt umgestellt, der Pointer ist nun private und wird per get_pointer() zurückgegeben. Ich hatte wohl damals was unglücklich falsch gemacht wodurch ich nun irrtümlich dachte, der Speicherbereich sei besonders geschützt, sodass man da eben nur durch klasseneigene Methoden reinschreiben kann. Damals gabs eben, wie gesagt, einen Speicherfehler, damit hatte sich das dann für mich erledigt.<br />
Aber ich habs jetzt umgeändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885235</guid><dc:creator><![CDATA[Ynnus]]></dc:creator><pubDate>Tue, 04 Oct 2005 22:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Tue, 04 Oct 2005 23:16:26 GMT]]></title><description><![CDATA[<p>Würde nicht auto_ptr aus der STL (memory) das selbe machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885250</guid><dc:creator><![CDATA[gurru]]></dc:creator><pubDate>Tue, 04 Oct 2005 23:16:26 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Wed, 05 Oct 2005 04:34:46 GMT]]></title><description><![CDATA[<p>gurru schrieb:</p>
<blockquote>
<p>Würde nicht auto_ptr aus der STL (memory) das selbe machen?</p>
</blockquote>
<p>hier is es etwas doof, da der pointer keinen op[] hat.(Ansonsten is es natürlich ok, wenn man mit dem vergleicht, was der threadstarter benutzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885296</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 05 Oct 2005 04:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Wed, 05 Oct 2005 05:21:28 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>gurru schrieb:</p>
<blockquote>
<p>Würde nicht auto_ptr aus der STL (memory) das selbe machen?</p>
</blockquote>
<p>hier is es etwas doof, da der pointer keinen op[] hat.(Ansonsten is es natürlich ok, wenn man mit dem vergleicht, was der threadstarter benutzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )</p>
</blockquote>
<p>Es wäre aber einfacher, die Klasse dann von auto_ptr abzuleiten, und dann darin den Operator[] zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885300</guid><dc:creator><![CDATA[gurru]]></dc:creator><pubDate>Wed, 05 Oct 2005 05:21:28 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Wed, 05 Oct 2005 07:01:45 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Ansonsten is es natürlich ok, wenn man mit dem vergleicht, was der threadstarter benutzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
das ist noch doofer, hier std::auto_ptr zu benutzen, als was threadstarter vorgeschlagt hat <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="😉"
    /><br />
Werf mal enen Blick in std::auto_ptr::~auto_ptr. Da findest zu sowas:</p>
<pre><code class="language-cpp">~auto_ptr() 
{
  delete _M_ptr; 
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Das nennt sich Undefined behaviour, da hier <strong>operator delete []</strong> benutzt werden muss. Also bitte boost::scoped_array anstatt std::auto_ptr benutzen!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885337</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Wed, 05 Oct 2005 07:01:45 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Wed, 05 Oct 2005 07:02:37 GMT]]></title><description><![CDATA[<p>gurru schrieb:</p>
<blockquote>
<p>Es wäre aber einfacher, die Klasse dann von auto_ptr abzuleiten, und dann darin den Operator[] zu definieren.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/885338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885338</guid><dc:creator><![CDATA[ssm]]></dc:creator><pubDate>Wed, 05 Oct 2005 07:02:37 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Wed, 05 Oct 2005 07:07:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Es wäre aber einfacher, die Klasse dann von auto_ptr abzuleiten, und dann darin den Operator[] zu definieren.</p>
</blockquote>
<p>Ja ne is klar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885342</guid><dc:creator><![CDATA[*ROFLMAO*]]></dc:creator><pubDate>Wed, 05 Oct 2005 07:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to Hab ich hier eventuell etwas nicht berücksichtigt? on Wed, 05 Oct 2005 07:51:24 GMT]]></title><description><![CDATA[<p>ssm schrieb:</p>
<blockquote>
<p>das ist noch doofer, hier std::auto_ptr zu benutzen, als was threadstarter vorgeschlagt hat <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="😉"
    /><br />
Werf mal enen Blick in std::auto_ptr::~auto_ptr. Da findest zu sowas:</p>
<pre><code class="language-cpp">~auto_ptr() 
{
  delete _M_ptr; 
}
</code></pre>
</blockquote>
<p>OK, das hab ich übersehen. (Also vergessen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/885371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/885371</guid><dc:creator><![CDATA[gurru]]></dc:creator><pubDate>Wed, 05 Oct 2005 07:51:24 GMT</pubDate></item></channel></rss>