<?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[Theoretische Frage delete]]></title><description><![CDATA[<p>Ich habe vor Kurzem hier gefragt wie man delete aufrufen muß wenn man ein Array von Objekten einer bestimmen Klasse haben will (Die Klasse ist also Elementtyp)</p>
<p>Klasse: was_weiß_ich</p>
<pre><code class="language-cpp">was_weiß_ich *t = new was_weiß_ich[1000];
</code></pre>
<p>Die Antwort war:</p>
<blockquote>
<p>Zu 1.:</p>
<pre><code class="language-cpp">delete [] t;
</code></pre>
<p>Der Compile weiss, wieviel dort allociert wurde.</p>
</blockquote>
<p>Nun meine Frage dazu: Warum gibt es denn nicht sowas wie t.length() wie in java?<br />
Wenn das Programm später beim Aufruf von delete noch weiß wieviel Speicher es freigeben muß, muß doch diese Information irgendwie zumindest bis dahin irgendwo gespeichert sein. Das Programm kann das ja nicht erraten.<br />
Gibt es eine Möglichkeit da ranzukommen?</p>
<p>Da ich von java umgestiegen bin ist es wirklich konzeptionell schwierig sich daran zu gewöhnen immer eine Variable mitschleppen zu müssen, die die maximallänge des Arrays angibt!<br />
(in Java benutze ich einfach t.length wann ich will)<br />
Wie geht man mit diesem Problem den am geschicktesten um?<br />
(Ich finde dieses mitziehen der Variable macht das Programm nicht gerade übersichlicher)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/121721/theoretische-frage-delete</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 19:22:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/121721.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Sep 2005 20:14:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:14:57 GMT]]></title><description><![CDATA[<p>Ich habe vor Kurzem hier gefragt wie man delete aufrufen muß wenn man ein Array von Objekten einer bestimmen Klasse haben will (Die Klasse ist also Elementtyp)</p>
<p>Klasse: was_weiß_ich</p>
<pre><code class="language-cpp">was_weiß_ich *t = new was_weiß_ich[1000];
</code></pre>
<p>Die Antwort war:</p>
<blockquote>
<p>Zu 1.:</p>
<pre><code class="language-cpp">delete [] t;
</code></pre>
<p>Der Compile weiss, wieviel dort allociert wurde.</p>
</blockquote>
<p>Nun meine Frage dazu: Warum gibt es denn nicht sowas wie t.length() wie in java?<br />
Wenn das Programm später beim Aufruf von delete noch weiß wieviel Speicher es freigeben muß, muß doch diese Information irgendwie zumindest bis dahin irgendwo gespeichert sein. Das Programm kann das ja nicht erraten.<br />
Gibt es eine Möglichkeit da ranzukommen?</p>
<p>Da ich von java umgestiegen bin ist es wirklich konzeptionell schwierig sich daran zu gewöhnen immer eine Variable mitschleppen zu müssen, die die maximallänge des Arrays angibt!<br />
(in Java benutze ich einfach t.length wann ich will)<br />
Wie geht man mit diesem Problem den am geschicktesten um?<br />
(Ich finde dieses mitziehen der Variable macht das Programm nicht gerade übersichlicher)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880842</guid><dc:creator><![CDATA[MisterX]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:14:57 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:20:21 GMT]]></title><description><![CDATA[<p>MisterX schrieb:</p>
<blockquote>
<p>Gibt es eine Möglichkeit da ranzukommen?</p>
</blockquote>
<p>Mit Standard-C++-Mitteln nein. Als Alternative gibt es z.B. die Klasse std::vector; über die Methode size() kannst du die Anzahl der Elemente abfragen.</p>
<p>MisterX schrieb:</p>
<blockquote>
<p>Da ich von java umgestiegen bin ist es wirklich konzeptionell schwierig sich daran zu gewöhnen immer eine Variable mitschleppen zu müssen, die die maximallänge des Arrays angibt!</p>
</blockquote>
<p>Das macht die Vektorklasse für dich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880847</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:20:21 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:22:49 GMT]]></title><description><![CDATA[<p>1000*sizeof(was_weiss_ich)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880850</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:22:58 GMT]]></title><description><![CDATA[<p>Verwende std::vector.</p>
<p>Und zu deiner Frage: es geht einfach konzeptionell nicht. Ein Pointer hat einfach keine Länge, das passt nicht ins Konzept. Ein Pointer ist einfach eine Speicheradresse, Punkt aus. Er könnte ja schließlich auch mitten ins Array hineinzeigen - wie soll man dann jemals auf die richtige Länge kommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880853</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:23:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">struct test {
	int a[4];
	double d[2];
	};

int main()
	{
	test *ptr=new test[10];
         cout&lt;&lt;(sizeof*ptr*sizeof test);
	delete [] ptr;	
	return 0;
	};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/880854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880854</guid><dc:creator><![CDATA[Cpt.Tanga]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:25:36 GMT]]></title><description><![CDATA[<p>Was soll das darstellen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880859</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 20:26:39 GMT]]></title><description><![CDATA[<p>MisterX schrieb:</p>
<blockquote>
<p>Der Compile weiss, wieviel dort allociert wurde.</p>
</blockquote>
<p>naja, eigentlich weiß er es nicht. oder doch? ka. ist nicht definiert. ok, er weiß es offentichtlich, wenn er nichttriviale destruktoren aufrufen muß. aber bei pods? nee, da muß er es nicht wissen und ich hoffe mal, er schreibt es auch nirgends hin. bei delete[] muß er nicht die genau anzahl kennen, sondern muß´nur den speicher wegmachen. im falle eines binary buddy allocators wäre das die nächsthöhere zweierpotenz und die genau größeninfo der nutzdaten wüßte keiner.</p>
<blockquote>
<p>Nun meine Frage dazu: Warum gibt es denn nicht sowas wie t.length() wie in java?</p>
</blockquote>
<p>wieß nicht. vielleicht wegen speed. vielleicht wurde es auch einfach vergessen.</p>
<blockquote>
<p>Da ich von java umgestiegen bin ist es wirklich konzeptionell schwierig sich daran zu gewöhnen immer eine Variable mitschleppen zu müssen, die die maximallänge des Arrays angibt!</p>
</blockquote>
<p>benutz einfach vector&lt;int&gt; a; statt int* a=new int[10]; und du hast size() als methode. denk dran, den vector als referenz zu übergeben, weil das scheller ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880860</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 26 Sep 2005 20:26:39 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Mon, 26 Sep 2005 21:33:58 GMT]]></title><description><![CDATA[<p>So erfährt delete wieviel Speicher er freigeben muss:</p>
<p>Also,...<br />
Wenn du mit new Speicher anforderst wird ein Speicherblock für dich bereitgestellt der so aussieht...</p>
<pre><code>|---------------------|
|Daten über die Größe |
| des Speicherblocks  |
|---------------------|
|    Dein Speicher    |
|                     |
|---------------------|
</code></pre>
<p>Das heißt das du nicht nur Speicher für dein Objekt/Datentyp anforderst, sondern das vor diesen Speicherbereich noch Infos über die Größe des Speichers für operator delete stehen <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>Somit weiß delete wieviel er löschen muss <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="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/880897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880897</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 26 Sep 2005 21:33:58 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 05:34:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>ok, er weiß es offentichtlich, wenn er nichttriviale destruktoren aufrufen muß. aber bei pods? nee, da muß er es nicht wissen und ich hoffe mal, er schreibt es auch nirgends hin. bei delete[] muß er nicht die genau anzahl kennen, sondern muß´nur den speicher wegmachen.</p>
</blockquote>
<p>Das geht aber schlecht, wenn er eben nicht genau weiß wieviel. Es gibt doch die Variante von operator delete mit dem size Parameter. Da kann er dir immer die richtige Anzahl reingeben, er weiß es also sehr wohl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/880983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/880983</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 27 Sep 2005 05:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 08:09:52 GMT]]></title><description><![CDATA[<p>Ringding schrieb:</p>
<blockquote>
<p>Und zu deiner Frage: es geht einfach konzeptionell nicht. Ein Pointer hat einfach keine Länge, das passt nicht ins Konzept. Ein Pointer ist einfach eine Speicheradresse, Punkt aus. Er könnte ja schließlich auch mitten ins Array hineinzeigen - wie soll man dann jemals auf die richtige Länge kommen?</p>
</blockquote>
<p>Das ist so nicht ganz richtig. Der C++ Standard legt nicht fest, wie ein Zeiger intern aufgebaut ist, d.h. es muss sich nicht zwingend um eine Speicheradresse handeln, auch wenn es oft so ist.</p>
<p>Eine virtuelle Maschine z.B. koennte einen Zeiger aus Selektor:Offset bilden, und bei jedem Zugriff auf den Zeiger den Selektor in einer Tabelle nachschauen, Speicheradresse und Laenge des Speicherblocks ermitteln und dann z.B. Bereichspruefungen machen. So ein aehnliches Konzept gab es auch m.W. in MULTICS. Auf so einem System waere eine Spracherweiterung denkbar, mit der man die Groesse eines Speicherblocks auch nachtraeglich noch ermitteln konnte.</p>
<p>Viele Speicherverwaltungsroutinen merken sich intern auch die Groesse eines Speicherblocks, um ihn hinterher wieder freigeben zu koennen.</p>
<p>Wenn man das Feature in C++ unbedingt haben will, braucht man nur neue globale new- und delete-Operatoren zu schreiben, die jedem Speicherblock grundsaetzlich eine Laenge voran stellen, die man dann mittels einer weiteren Funktion abfragen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881041</guid><dc:creator><![CDATA[Power Off]]></dc:creator><pubDate>Tue, 27 Sep 2005 08:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 08:28:39 GMT]]></title><description><![CDATA[<p>Dann weißt du aber immer noch nicht, wo der Speicherblock beginnt. Du müsstest eine Tabelle (Hash Table z.B.) von sämtlichen Speicherblöcken mitführen, damit du immer weißt, in welchen Speicherblock ein bestimmter Pointer gerade zeigt - wie ich geschrieben habe, muss er ja nicht unbedingt an den Anfang eines Blocks zeigen. Er kann sogar ins Nirvana zeigen, solange er nicht dereferenziert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881058</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Tue, 27 Sep 2005 08:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 09:01:41 GMT]]></title><description><![CDATA[<p>Wenn Du ein new[] gemacht hast, und jetzt ein delete[] irgendwo mitten in den Speicherbereich machst, bringt das den Standardallokator mächtig durcheinander und gibt undefiniertes Verhalten. Der Pointer muss immmer an den Anfang des Blocks zeigen, wenn Du delete aufrufst. Smarte Implementierungen oder DebugTools können das erkennen und abfangen - zulässig ist das aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881084</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 27 Sep 2005 09:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 09:14:28 GMT]]></title><description><![CDATA[<p>Ringding schrieb:</p>
<blockquote>
<p>Dann weißt du aber immer noch nicht, wo der Speicherblock beginnt. Du müsstest eine Tabelle (Hash Table z.B.) von sämtlichen Speicherblöcken mitführen, damit du immer weißt, in welchen Speicherblock ein bestimmter Pointer gerade zeigt - wie ich geschrieben habe, muss er ja nicht unbedingt an den Anfang eines Blocks zeigen. Er kann sogar ins Nirvana zeigen, solange er nicht dereferenziert wird.</p>
</blockquote>
<p>Intel 80x86 (auch Pentium) Prozessoren machen das genauso (z.B. im 32-Bit Protected Mode): Der Selektor ist ein Index in die Speicher-Deskriptortabelle und der Offset gibt den relativen Versatz der Adresse an. Du siehst, das geht also sehr wohl.</p>
<p>Im Flat Speichermodell sind die Selektoren vom Betriebssystem vorgegeben, aber es gibt auch unter Windows XP und Linux far pointer, die mit Selektor:Offset arbeiten (48 Bit).</p>
<p>Ueber den Offset-Teil addressiert Du die Position relativ zum Speicherblock, der durch den Selektor adressiert wird.</p>
<pre><code class="language-cpp">// char* p = new char [2]; vorausgesetzt
p[0] = 'A';
p[1] = 'B';
</code></pre>
<p>sieht z.B. fuer die virtuelle Maschine dann so aus:</p>
<pre><code>p = 78A9:00000000
78A9:00000000 = A
78A9:00000001 = B
</code></pre>
<p>Der Selektor-Lookup wuerde ueber eine Tabelle der Form:</p>
<pre><code class="language-cpp">MemDescriptor table[0X10000];
</code></pre>
<p>erfolgen.</p>
<p>Im 80x86 / Pentium Prozessor wird das ueber spezielle Lookup-Tables gemacht, siehe Prozessorhandbuch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881100</guid><dc:creator><![CDATA[Power Off]]></dc:creator><pubDate>Tue, 27 Sep 2005 09:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 09:21:55 GMT]]></title><description><![CDATA[<p>Wenn du damit leben kannst, dass du dann dafür Unterstützung vom Kernel brauchst und maximal ca. 8000 Speicherblöcke allozieren kannst, na gut...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881106</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Tue, 27 Sep 2005 09:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 09:24:39 GMT]]></title><description><![CDATA[<p>Ringding schrieb:</p>
<blockquote>
<p>Wenn du damit leben kannst, dass du dann dafür Unterstützung vom Kernel brauchst und maximal ca. 8000 Speicherblöcke allozieren kannst, na gut...</p>
</blockquote>
<p>Bei einer virtuellen Maschine lege doch <strong>ich</strong> die Funktionsweise fest. Das hat mit dem Betriebssystem ueberhaupt nix zu tun.</p>
<p>Und die Groesse der Tabelle, sowie Deskriptorformat etc. kann ich ja auch selber festlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881110</guid><dc:creator><![CDATA[Power Off]]></dc:creator><pubDate>Tue, 27 Sep 2005 09:24:39 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 10:32:00 GMT]]></title><description><![CDATA[<p>Ok, würde in den meisten Fällen funktionieren. Man bräuchte aber dann auch einen recht großen int-artigen Typ, der so einen Pointer aufnehmen kann. int_ptr_t oder so ähnlich heißt das in C99, ich hab's vergessen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/881163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881163</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Tue, 27 Sep 2005 10:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to Theoretische Frage delete on Tue, 27 Sep 2005 10:48:02 GMT]]></title><description><![CDATA[<p>Ringding schrieb:</p>
<blockquote>
<p>Ok, würde in den meisten Fällen funktionieren. Man bräuchte aber dann auch einen recht großen int-artigen Typ, der so einen Pointer aufnehmen kann. int_ptr_t oder so ähnlich heißt das in C99, ich hab's vergessen...</p>
</blockquote>
<p>Sag mal ... hast Du schon mal was von &quot;struct&quot; gehoert?</p>
<pre><code class="language-cpp">struct vmptr_t {
   int selector;
   int offset;
};
</code></pre>
<p>zum Bleistift.</p>
<p>Oder gleich:</p>
<pre><code class="language-cpp">class scopedescriptor_t {
   public:
   char* memory;
   size_t memsize;
};
class vmptr_t {
   public:
   scopedescriptor_t* desc;
   size_t offset;
};
</code></pre>
<p>Das koennte z.B. ein C++ nach C++ Transcompiler verwenden,<br />
um z.B.</p>
<pre><code class="language-cpp">// char* p = new char[2]; vorausgesetzt
p[0] = 'A';
p[1] = 'B';
</code></pre>
<p>zu uebersetzen in:</p>
<pre><code class="language-cpp">// vmptr_t p = vm_create_char_vector( 2 ); etc.
if ( p.offset + 0U &lt; p.desc-&gt;memsize ) p.desc-&gt;memory[0U] = 'A'; else throw vm_exception_pointer_violation( p, 0U );
if ( p.offset + 1U &lt; p.desc-&gt;memsize ) p.desc-&gt;memory[1U] = 'B'; else throw vm_exception_pointer_violation( p, 1U );
</code></pre>
<p>Jetzt alle Klarheiten beseitigt? <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/881170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/881170</guid><dc:creator><![CDATA[Power Off]]></dc:creator><pubDate>Tue, 27 Sep 2005 10:48:02 GMT</pubDate></item></channel></rss>