<?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[Char array übergabe]]></title><description><![CDATA[<p>Halllo Leute,</p>
<p>ich habe diese zwei Methoden und die zicken etwas rum.</p>
<p>Wenn recvSocket verlassen wird, verliert die Variable data ihren Inhalt.<br />
In der Methode selber steht in data was drin, aber hinterher nicht mehr.</p>
<p>Und ich weiß, es ist ein ganz schöner Misch-Masch aus C und C++, aber lassen wir es einfach so mal stehen.</p>
<pre><code class="language-cpp">void sslSocketS::recvSocket ( char *data ) {

	if ( !validSocket() ) {
		info ( &quot;Socket ist broken!&quot; );
		delete this;
	};

	if ( data != NULL) delete[] data;
	data = new char[ MAXRECV + 1 ];
	memset ( data, 0, MAXRECV + 1 );
	ssize_t size = ssl_read ( m_ssl, (unsigned char*) data, MAXRECV + 1 );

	if ( size == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY ) {
		delete[] data;
		data == NULL;
		info ( &quot;Client disconnected&quot; );
		delete this;
	}
	else if ( size == POLARSSL_ERR_NET_CONN_RESET ) {
		delete[] data;
		data = NULL;
		warning ( &quot;Reset by Peer!&quot; );
		delete this;
	}
}

void ClientS::checkSocket ( ev::io &amp;watcher, int revents ) {

	if (EV_ERROR &amp; revents) {
        	error( &quot;got invalid event&quot; );
        	return;
        }

	char *buf = NULL;

        if ( revents &amp; EV_READ ){
            	recvSocket ( buf );
	}
       	else  {
        	m_io.set ( ev::READ | ev::WRITE );
		return;
	}

        /// hier ist der buf wieder NULL?!

	readInput ( buf );

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/306546/char-array-übergabe</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 16:40:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306546.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 Jul 2012 22:36:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 22:36:34 GMT]]></title><description><![CDATA[<p>Halllo Leute,</p>
<p>ich habe diese zwei Methoden und die zicken etwas rum.</p>
<p>Wenn recvSocket verlassen wird, verliert die Variable data ihren Inhalt.<br />
In der Methode selber steht in data was drin, aber hinterher nicht mehr.</p>
<p>Und ich weiß, es ist ein ganz schöner Misch-Masch aus C und C++, aber lassen wir es einfach so mal stehen.</p>
<pre><code class="language-cpp">void sslSocketS::recvSocket ( char *data ) {

	if ( !validSocket() ) {
		info ( &quot;Socket ist broken!&quot; );
		delete this;
	};

	if ( data != NULL) delete[] data;
	data = new char[ MAXRECV + 1 ];
	memset ( data, 0, MAXRECV + 1 );
	ssize_t size = ssl_read ( m_ssl, (unsigned char*) data, MAXRECV + 1 );

	if ( size == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY ) {
		delete[] data;
		data == NULL;
		info ( &quot;Client disconnected&quot; );
		delete this;
	}
	else if ( size == POLARSSL_ERR_NET_CONN_RESET ) {
		delete[] data;
		data = NULL;
		warning ( &quot;Reset by Peer!&quot; );
		delete this;
	}
}

void ClientS::checkSocket ( ev::io &amp;watcher, int revents ) {

	if (EV_ERROR &amp; revents) {
        	error( &quot;got invalid event&quot; );
        	return;
        }

	char *buf = NULL;

        if ( revents &amp; EV_READ ){
            	recvSocket ( buf );
	}
       	else  {
        	m_io.set ( ev::READ | ev::WRITE );
		return;
	}

        /// hier ist der buf wieder NULL?!

	readInput ( buf );

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2237460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237460</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Tue, 31 Jul 2012 22:36:34 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 22:44:17 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Und ich weiß, es ist ein ganz schöner Misch-Masch aus C und C++, aber lassen wir es einfach so mal stehen.</p>
</blockquote>
<p>Nie im Leben. Ersetze einfach alle char-Zeiger durch std::string, dann duerfte es sehr schnell besser gehen mit deinen Programmen <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>
<p>Und sowieso: EKLIG. Alles refactoren, hopp hopp!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237462</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 31 Jul 2012 22:44:17 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 22:49:29 GMT]]></title><description><![CDATA[<p>Hab den Fehler nun doch endlich gefunden ... habe den Pointer im scope von recvSocket ja neu gesetzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>habe einfach die data als Rückgabewert genommen, macht weniger Probleme und ist einfach mal schöneres C. <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>
<p>Und ja zum Misch Masch muss ich noch dazu sagen, dass es einfach mal doof ist mit in C geschrieben Libs zu arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237464</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Tue, 31 Jul 2012 22:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 22:56:42 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Und ich weiß, es ist ein ganz schöner Misch-Masch aus C und C++, aber lassen wir es einfach so mal stehen.</p>
</blockquote>
<p>Das geht aber nicht so einfach, da sind viel zu viele Fehler drin.</p>
<p>Ein paar Merksätze:<br />
- Kommt in deinem Code ein delete[] drin vor, machst du mit sehr hoher Wahrscheinlichkeit etwas falsch, da du nicht vector genommen hast.<br />
- Kommt jemals <code>delete this;</code> vor, dann machst du fast sicher etwas falsch, weil du dir dadurch selber das Bein abschießt. Es gibt auf der Welt vielleicht eine handvoll Codefetzen, bei denen ein <code>delete this;</code> sinnvoll eingesetzt wird, die meisten davon Beispiele dafür, unter welchen verrückten Ausnahmesituationen man das doch machen kann.<br />
- Wenn du aus einer Funktion etwas heraus gibst, was dann außerhalb mit delete gelöscht werden muss, machst du etwas falsch. Punkt.<br />
- Ein reinterpret_cast (oder ein Cast im C-Stil, da dieser auch ein reinterpret_cast sein kann - das Problem ist, dass man das nicht so genau sehen kann) ist höchstwahrscheinlich auch ein Fehler, da deine Datentypen nicht stimmen.</p>
<p>Das waren deine Sünden, nun zu deinem Problem:<br />
<code>void sslSocketS::recvSocket ( char *data )</code> : Falls du hier wirklich den Wert der beim Aufruf übergebenen Variablen ändern willst, musst du die Übergabe per Referenz durchführen. Da dies eigentlich ziemlich weit vorne in einem Lehrbuch drankommen sollte, nehme ich mal an, dass du noch nicht so weit gelesen hast. Dann muss ich aber sagen, dass Socketprogrammierung viel zu schwierig für deinen Kenntnisstand ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237465</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 31 Jul 2012 22:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 23:02:32 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Und ja zum Misch Masch muss ich noch dazu sagen, dass es einfach mal doof ist mit in C geschrieben Libs zu arbeiten.</p>
</blockquote>
<p>Nur wenn du anfängst, drumherum auch C zu machen. Die Container der Standardbibliothek sind zu C-Interfaces kompatibel, um C-Pseudoobjekten kann man wunderbar &quot;echte&quot; Klassen schreiben, dank den C-Sprachmitteln wie Templates und Überladungen kann die Interfaces offen halten und muss sich nicht auf C-Basisdatentypen beschränken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237467</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 31 Jul 2012 23:02:32 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 23:08:58 GMT]]></title><description><![CDATA[<blockquote>
<p>Kommt jemals delete this; vor, dann machst du fast sicher etwas falsch, weil du dir dadurch selber das Bein abschießt</p>
</blockquote>
<p>Wieso sollte man damit etwas falsch machen? Wenn in dem Fall ein Socket kaputt ist, wieso auch immer, dann zerstöre ich das Object. Für jede Verbindung wird bei mir ein Object erstellt. Und damit die sich nicht ansammeln müssen ja die defekten mal raus.</p>
<blockquote>
<p>Kommt in deinem Code ein delete[] drin vor, machst du mit sehr hoher Wahrscheinlichkeit etwas falsch</p>
</blockquote>
<p>Ok, delete[] auf Zeile 8 ist quark, sollte man anders lösen, aber genrel muss ich doch meine erstellten array wieder löschen können. Weiß nicht wieso das falsch sein sollte.</p>
<blockquote>
<p>..nehme ich mal an, dass du noch nicht so weit gelesen hast ..</p>
</blockquote>
<p>Ist eher ein Problem der Überarbeitung und der Mündlichkeit <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/2237469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237469</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Tue, 31 Jul 2012 23:08:58 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 23:15:24 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<blockquote>
<p>Kommt jemals delete this; vor, dann machst du fast sicher etwas falsch, weil du dir dadurch selber das Bein abschießt</p>
</blockquote>
<p>Wieso sollte man damit etwas falsch machen? Wenn in dem Fall ein Socket kaputt ist, wieso auch immer, dann zerstöre ich das Object. Für jede Verbindung wird bei mir ein Object erstellt. Und damit die sich nicht ansammeln müssen ja die defekten mal raus.</p>
</blockquote>
<p><code>delete this</code> ist *sehr* unschoenes Design. Wenn du dann noch ein Stackobjekt erstellst, wirds harig - und das kannst du nicht NICHT garantieren, ausser du bastelst dir eine factory mit ueberladenem <code>operator new</code> usw. BUARKS</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237471</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 31 Jul 2012 23:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 23:29:06 GMT]]></title><description><![CDATA[<p>Schon klar was die Stacks anbelangt und so, aber in MEINEM speziellen Fall ist es einfacher die Objekte sich selber killen zu lassen und über den Destructor sich aus dem global erreichbaren Stack zu löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237472</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Tue, 31 Jul 2012 23:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Tue, 31 Jul 2012 23:48:16 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>global erreichbaren Stack</p>
</blockquote>
<p>Das ist es gerade. Du darfst nur Speicher freigeben, der im Heap allokiert wurde. Das der von deiner Instanz ( <code>*this</code> ) aber auch mit bspw. <code>new</code> allokiert wurde, <strong>garantiert keiner</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237475</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 31 Jul 2012 23:48:16 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 00:06:20 GMT]]></title><description><![CDATA[<p>Ach ****, habe an das richtige gedacht und das falsche geschrieben - ist natürlich alles im Heap - und darauf wurde explizit beim coden geachtet das halt kein Problem damit ensteht.</p>
<p>Weiß jetzt aber auch was ihr meint und worauf ihr hinaus wolltet, danke euch <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2237478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237478</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Wed, 01 Aug 2012 00:06:20 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 09:02:14 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Weiß jetzt aber auch was ihr meint und worauf ihr hinaus wolltet, danke euch <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>
</blockquote>
<p>Nein, du weißt, worauf Sone hinaus will, aber nicht worauf ein vernünftiger Mensch hinaus möchte <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="😉"
    /> : Was passiert, wenn du später auf Member zugreifst? Bämm! Außerdem: Wie erfährt der Rest des Programms, dass das Objekt sich soeben selber zerstört hat? Der Aufrufer der Funktion hat immer noch seinen Pointer auf das Objekt und wird ihn wieder benutzen. Bämm!</p>
<p>Von dem was du anscheinend erreichen möchtest, suchst du eine Exception, keinen Selbstmord.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237546</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 01 Aug 2012 09:02:14 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 21:17:42 GMT]]></title><description><![CDATA[<p>MAN! SeppJ!</p>
<p>Du weißt doch nicht mal wie mein Globaler Speicher aussieht, in dem meine Objekte liegen und schon urteilst du darüber, dass er hier und da Fehler verursacht. Aber hier einmal zur Info : auf die Objekte wir über eine statische Klasse zugegriffen in der überprüft wird ob das Objekt valide ist oder nicht.</p>
<p>Wenn du dennoch der Meinung bist, du könntest mich eines besseren belehren, dann lass uns wo anders unterhalten und hier nicht spammen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237768</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Wed, 01 Aug 2012 21:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 23:00:19 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>sluz schrieb:</p>
<blockquote>
<p>Weiß jetzt aber auch was ihr meint und worauf ihr hinaus wolltet, danke euch <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>
</blockquote>
<p>Nein, du weißt, worauf Sone hinaus will, aber nicht worauf ein vernünftiger Mensch hinaus möchte <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>
</blockquote>
<p>Das war einer der Gruende, wieso <code>delete this</code> beschissen ist.</p>
<p>DAS ist auch einer der Gruende wieso ich mich von der Irrlicht Engine distanziert habe.</p>
<p><a href="http://irrlicht.sourceforge.net/docu/_i_reference_counted_8h_source.html#l00116" rel="nofollow">http://irrlicht.sourceforge.net/docu/_i_reference_counted_8h_source.html#l00116</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237775</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 23:00:19 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 22:20:56 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>MAN! SeppJ!</p>
<p>[...]</p>
<p>Wenn du dennoch der Meinung bist, du könntest mich eines besseren belehren, dann lass uns wo anders unterhalten und hier nicht spammen</p>
</blockquote>
<p>Wenn du meinst, dass du mit</p>
<blockquote>
<p>auf die Objekte wir über eine statische Klasse zugegriffen in der überprüft wird ob das Objekt valide ist oder nicht.</p>
</blockquote>
<p>mich auch nur irgendwie überzeugen könntest, dass hier irgendetwas sinnvolles vorgeht, dann hast du gerade das Gegenteil erreicht. Hör auf mit dem C/Java-Denk (ich bin mir nicht mir sicher, welche Programmiersprache du gerade nachzumachen versuchst): C++ ist anders!</p>
<p>Einen brauchbarem Lösungsvorschlag erhältst du, wenn du verrätst, was du genau <em>erreichen</em> möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237779</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 01 Aug 2012 22:20:56 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 22:50:07 GMT]]></title><description><![CDATA[<p>Eine Lösung habe ich schon lange, willst du wirklich sehen, was ich versuche aufzubauen? Aber na gut - Ich baue einen kleinen Instant-Messenger auf Basis von libev/GTK/polarssl.</p>
<p>Der delete this Teil ist ein Part vom libev loop indem die SSL Sockets angenommen werden und neue Objekte ( Clients ) mit allen Socket relevanten Informationen erstellt werden.</p>
<p>Es werden dann aber auch wirklich alle im Heap erstellt ( weswegen ich auch delete this bedenkenlos anwenden kann ), diese Pointer lagere ich in einer Static Klasse aus, damit ich vom Frontend auf die einzelnen Clients zugreifen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237786</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Wed, 01 Aug 2012 22:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 22:54:19 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Es werden dann aber auch wirklich alle im Heap erstellt ( weswegen ich auch delete this bedenkenlos anwenden kann ),</p>
</blockquote>
<p>Das ist ein sauhaessliches Design.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237788</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 22:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 22:58:12 GMT]]></title><description><![CDATA[<p>//Nachtrag<br />
Achso und delete this wird ja nur aufgerufen wenn der Socket hinne ist - und wenn der Socket defekt ist, hat das ganze Objekt keinen Sinn mehr.</p>
<p>Diese Objekte arbeiten alle selbstständig in dem ev-Loop und werden sonst nicht von irgend einer anderen Klasse oder so überwacht - daher müssen die sich selber bereinigen wenn was nicht stimmt.</p>
<p>UND</p>
<blockquote>
<p>Ich dachte, ein halbwegs geistlich labiler Programmierer wuerde ALLERHOECHSTENS im Destruktor delete this; schreiben. Alles andere ist Wahnsinn.</p>
</blockquote>
<p>Welchen Sinn macht es im destructor delete this aufzurufen wenn das Objekt in dem Moment schon zerstört wird? Gerade das erscheint mir unlogisch zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237789</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Wed, 01 Aug 2012 22:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 22:59:32 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Gerade das erscheint mir unlogisch zu sein.</p>
</blockquote>
<p>Ja, da hab ich dank einem Denkfehler Meilenweit verfehlt. Entschuldige.<br />
Trotzdem ist es haesslich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237791</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 22:59:32 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 23:05:29 GMT]]></title><description><![CDATA[<p>Sone,<br />
schau dir mal bitte den Code hier an - <a href="http://www.skitoy.com/p/writing-an-echo-server-in-libev-and-c/375" rel="nofollow">http://www.skitoy.com/p/writing-an-echo-server-in-libev-and-c/375</a></p>
<p>Zeile 107 &amp; 159 wären da relevant - kannst mir dann auch gerne sagen, dass das auch hässlicher Code ist, aber dann würde ich sehr gerne mal sehen wie &quot;schöner&quot; Code aussieht und wie man es lösen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237793</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Wed, 01 Aug 2012 23:05:29 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 23:09:18 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Zeile 107 &amp; 159 wären da relevant - kannst mir dann auch gerne sagen, dass das auch hässlicher Code ist, aber dann würde ich sehr gerne mal sehen wie &quot;schöner&quot; Code aussieht und wie man es lösen könnte.</p>
</blockquote>
<p><strong>Ohne das jetzt so anzusehen</strong>, wuerde ich falls eine Heap-Allokation <em><strong>wirklich</strong></em> noetig ist einfach Smart-Pointer statt rohe Pointer bei der Instanziierung nehmen.</p>
<p>Also statt</p>
<pre><code class="language-cpp">EchoInstance* ptr = new EchoInstance(...);
//das
std::unique_ptr&lt;EchoInstance&gt; ptr( new EchoInstance(...) );
</code></pre>
<p>Nennt sich RAII <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2237795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237795</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 23:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 23:16:54 GMT]]></title><description><![CDATA[<p>Smartpointer schön und gut - aber das ändert leider nichts daran, dass sich die Objekte selber bereinigen müssen wenn der Socket im Objekt hinne ist.</p>
<p>Und gerade an dem Punkt sehe ich keine andere Lösung als sich selber zu Töten - sonst hat ja keiner drauf Zugriff um zu testen ob das Objekt noch in Takt ist oder nicht. Muss halt von innen passieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237799</guid><dc:creator><![CDATA[sluz]]></dc:creator><pubDate>Wed, 01 Aug 2012 23:16:54 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Wed, 01 Aug 2012 23:49:58 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Smartpointer schön und gut - aber das ändert leider nichts daran, dass sich die Objekte selber bereinigen müssen wenn der Socket im Objekt hinne ist.</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>Schau mal, was Smartpointer sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237803</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 01 Aug 2012 23:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Thu, 02 Aug 2012 00:07:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::unique_ptr&lt;EchoInstance&gt; ptr( new EchoInstance(...) );
</code></pre>
<p>Und danach? Lässt du den Client in der nächsten Zeile sterben, wenn die Funktion zurückkehrt?</p>
<p>Prinzipiell kann man <code>delete this;</code> zwar machen, aber dann sollte der Konstruktor nicht öffentlich sein. Stattdessen bietest du eine statische create()-Methode an, die eine Instanz korrekt erzeugt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237805</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 02 Aug 2012 00:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Thu, 02 Aug 2012 00:19:50 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Und danach? Lässt du den Client in der nächsten Zeile sterben, wenn die Funktion zurückkehrt?</p>
</blockquote>
<p>Ich deklariere ihn da, wo ich ihn brauche... wenn er weiterleben soll, wird das ueber Move-Semantik geklaert ( <code>return unique_ptr&lt;..&gt;(..);</code> ) oder ueber einen <code>shared_ptr</code> .</p>
<p>Auf jeden fall so, dass</p>
<ul>
<li>semantisch garantiert wird dass der Speicher freigegeben wird</li>
<li>Kein <code>delete this</code> im Code steht.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2237808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237808</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 02 Aug 2012 00:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Thu, 02 Aug 2012 01:28:42 GMT]]></title><description><![CDATA[<p>Da Sone hier ja den Fundamentalisten spielt, will ich im Gegensatz zu ihm mit mehr Argumenten antworten.</p>
<p>In der <a href="http://www.parashift.com/c++-faq-lite/delete-this.html" rel="nofollow">C++ FAQ</a> sind die Bedingungen aufgeführt, die erfüllt sein müssen, um <code>delete this;</code> einzusetzen. Hinweisen möchte ich insbesondere auf Regel 3:</p>
<blockquote>
<p>3.) You must be absolutely 100% positively sure that the rest of your member function (after the delete this line) doesn't touch any piece of this object (including calling any other member functions or touching any data members).</p>
</blockquote>
<p>Jetzt dein Code:</p>
<pre><code class="language-cpp">void sslSocketS::recvSocket ( char *data ) {

    if ( !validSocket() ) {
        info ( &quot;Socket ist broken!&quot; );
        delete this;
    };
    ...
    ssize_t size = ssl_read ( m_ssl, (unsigned char*) data, MAXRECV + 1 );
    ...
}
</code></pre>
<p>Auch wenn man nur vermuten kann, da du deine Klassendeklaration nicht angegeben hast, würde ich behaupten, dass <code>ssl_read()</code> und <code>m_ssl</code> Member deiner <code>sslSocketS</code> -Klasse sind.<br />
Damit hat dein Code, für den Fall, dass <code>delete this;</code> ausgeführt wird, undefiniertes Verhalten.<br />
Ich glaube auch, dass dein gepostetes Beispielprogramm nicht korrekt ist. Dort wird in der Funktion <code>read_cb()</code>  <code>delete this;</code> aufgerufen. Dem Aufruf von <code>read_cb()</code> in Zeile 60 folgt in Zeile 65 der Zugriff auf die Membervariable <code>write_queue</code> . Also auch hier potentiell undefiniertes Verhalten.</p>
<p>Ich hoffe, du siehst ein, wie gefährlich der Gebrauch von <code>delete this;</code> ist und solltest es deshalb komplett vermeiden. Wie schon angesprochen lassen sich selbst die meisten Vorkommen von <code>delete</code> vermeiden, in dem man RAII zur Resourcenvewaltung einsetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237814</guid><dc:creator><![CDATA[ananas]]></dc:creator><pubDate>Thu, 02 Aug 2012 01:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Char array übergabe on Thu, 02 Aug 2012 02:11:46 GMT]]></title><description><![CDATA[<p>sluz schrieb:</p>
<blockquote>
<p>Eine Lösung habe ich schon lange, willst du wirklich sehen, was ich versuche aufzubauen? Aber na gut - Ich baue einen kleinen Instant-Messenger auf Basis von libev/GTK/polarssl.</p>
<p>Der delete this Teil ist ein Part vom libev loop indem die SSL Sockets angenommen werden und neue Objekte ( Clients ) mit allen Socket relevanten Informationen erstellt werden.</p>
<p>Es werden dann aber auch wirklich alle im Heap erstellt ( weswegen ich auch delete this bedenkenlos anwenden kann ), diese Pointer lagere ich in einer Static Klasse aus, damit ich vom Frontend auf die einzelnen Clients zugreifen kann.</p>
</blockquote>
<p>Also hat die statische Klasse (ich nenn diese einfach die Verwalterklasse) ein Pointer-Array, in dem die Sockets sind, und wenn die Sockets nicht funktionieren, lässt du sie mit delete this zerstören? Stell mich richtig, wenn ich dein Design nicht ganz durchschaue.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237815</guid><dc:creator><![CDATA[IrgendeinName]]></dc:creator><pubDate>Thu, 02 Aug 2012 02:11:46 GMT</pubDate></item></channel></rss>