Ich verwende C++ jetzt schon eine Weile. Ich bin nur nie sicher, wie die Speicherverwaltung funktioniert, also hier geht es:
Ich bin mir zunächst nicht sicher, wie Speicher in einer Funktion freigegeben wird, z. B:
int addTwo(int num)
{
int temp = 2;
num += temp;
return num;
}
Also in diesem Beispiel, würde temp aus dem Speicher entfernt werden, nachdem die Funktion endet? Wenn nicht, wie wird das gemacht. In C# wird eine Variable entfernt, sobald ihr Bereich aufgebraucht ist. Gibt es noch andere Fälle, die ich kennen sollte?
感謝
0 Stimmen
Dieser Code ist reines C. Daher findet hier keine C++-Speicherverwaltung statt. Dies wäre nur der Fall, wenn "
new
" würde zur Erstellung von temp verwendet werden.0 Stimmen
Erneut als "C" gekennzeichnet, weil es hier kein C++ gibt, wie jemand anderes unten bemerkt hat.
6 Stimmen
Als C++ gekennzeichnet, da es sich eindeutig um eine C++-Frage handelt und der Fragesteller ausdrücklich nach C++ fragt.
9 Stimmen
OP, Sie müssen keine der Antworten akzeptieren.
1 Stimmen
OP, es könnte allerdings erforderlich sein, alle Kommentare zu sichten ;)
0 Stimmen
@San Jacinto Nein, ist es nicht. Es gibt keinen Vertrag, weder stillschweigend noch anderweitig, zwischen Fragesteller und Antwortgeber. Wenn er nicht annehmen will, aus welchen Gründen auch immer, ist das sein Recht - er muss sich nicht rechtfertigen. Dieses Thema wurde übrigens schon auf Meta zu Tode diskutiert.
0 Stimmen
@Neil, San Jacinto: Bitte diskutieren Sie hier nicht... Nun zur Sache: Was meinen Sie mit "aus dem Speicher entfernt"? Physisch (überschrieben) oder konzeptionell (sollte nicht zugegriffen werden, ruft undefiniertes Verhalten hervor, aber man könnte damit durchkommen) ?
0 Stimmen
Meiner bescheidenen Meinung nach ist der Stack ein sehr unterschätztes Speicherverwaltungssystem. Ein Problem, das ich mit Sprachen habe, die eine eingebaute Garbage Collection haben, ist, dass sie den Stack so selten auf intelligente Weise nutzen. Außerdem ist eine gute Unterstützung für die Stack-Speicherung ein wesentlicher Bestandteil davon, dass komplexe Datentypen in andere Datentypen eingebettet werden können, anstatt über einen Zeiger referenziert zu werden. Und auch das ist in vielen Fällen ein großer Gewinn.
0 Stimmen
@Omnifarious Der Stack hat nichts damit zu tun, dass Objekte andere Objekte enthalten können, zumindest in C++. Wenn Sie zum Beispiel ein Objekt mit "new" erstellen, wird nichts auf dem Stack erstellt.
0 Stimmen
@Neil, nennen Sie mir eine Sprache, in der Variablen mit komplexer Struktur auf dem Stack, aber nicht in anderen Strukturen gespeichert werden können. Sie haben nicht direkt etwas miteinander zu tun, aber sie sind verwandte Ideen.
0 Stimmen
@Omnifarious sie sind wirklich nicht verwandt. In jedem Fall gibt man den Strutures einen Platz und Raum zum Leben, und sie werden im Speicher an ihrer Startadresse abgebildet. Der einzige Unterschied besteht darin, dass es an der Zeit ist, diese Strukturen zu zerstören und sie freizugeben, weil man feststellen muss, wessen Aufgabe das ist.
0 Stimmen
@Omnifarious Sie haben den Vorteil, dass, wenn Sie Ihre Objekte vollständig deklarieren, 100% auf dem Stack (dies bedeutet keine Zeiger auf Heap-Space in den Objekten), dass Sie wahrscheinlich weniger Speicherfragmentierung haben.
0 Stimmen
@Omnifarours "Nennen Sie mir eine Sprache, in der Variablen mit komplexer Struktur auf dem Stack, aber nicht in anderen Strukturen gespeichert werden können" - Ich habe so etwas nie auch nur annähernd vorgeschlagen.