Normalerweise wird die Speicherverwaltung im Zusammenhang mit dynamischem Speicher verwendet, der durch
new
malloc
In der normal Code verhält sich C++ wie jede andere Sprache auch. Wenn Sie eine Variable erstellen oder zurückgeben, wird sie kopiert und ist auf der Zielseite zugänglich.
int a = addTwo(3);
erhält eine Kopie des zurückgegebenen Wertes. Wenn der Rückgabewert eine Klasse ist, wird der Kopieroperator aufgerufen. Solange Sie also nicht mit new und malloc arbeiten, müssen Sie sich nicht so sehr um das Speichermanagement kümmern.
Eine weitere wichtige Bemerkung
void func(std::string abc)
{
// method gets a copy of abc
}
void func(std::string& abc)
{
// method gets the original string object which can be modified without having to return it
}
void func(const std::string& abc)
{
// method gets the original string object abc but is not able to modify it
}
Der Unterschied zwischen den drei Zeilen ist sehr wichtig, da Ihr Programm viel Zeit damit verbringen kann, Kopien von Eingabeparametern zu erstellen, die Sie normalerweise nicht erstellen wollten.
z.B..
bool CmpString(std::string a, std::string b)
{
return a.compare(b);
}
ist sehr teuer, weil die Zeichenketten a und b immer kopiert werden. Verwenden Sie
bool CmpString(const std::string& a, const std::string& b)
stattdessen.
Dies ist wichtig, da standardmäßig keine Refcounted-Objekte verwendet werden.
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.