7 Stimmen

Wann werden Variablen in C++ aus dem Speicher entfernt?

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.

2voto

Totonga Punkte 4152

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.

1voto

San Jacinto Punkte 8628

Bitte beachten Sie meine Antwort auf diese Frage. Vielleicht klärt sie eine Menge Dinge für Sie.

Wie funktioniert eigentlich die automatische Speicherzuweisung in C++?

Ich stelle den Link nicht nur zum Spaß ein. Meine Antwort dort ist ein eingehender Blick (auf einer sehr einführenden Ebene), wie die Speicherverwaltung funktioniert.

0voto

Sebastian Punkte 4712

Die Variable temp ist dem Stack zugeordnet. Das heißt, sie wird freigegeben, wenn die Funktion zurückkehrt.

Siehe z.B.:

0voto

tloach Punkte 8001

In diesem Fall sind sowohl num als auch temp für diese Funktion lokal. Wenn die Funktion aufgerufen wird, wird die in num übergebene Zahl vom Aufrufer in eine Variable auf dem Stack kopiert. Temp wird dann auf dem Stack angelegt. Wenn Sie zurückkehren, wird der Wert von num zurück zum Aufrufer kopiert, und die in der Funktion verwendeten Variablen temp und num werden gelöscht.

0voto

Ashish Punkte 7999

In C, C++ lokale Variablen tienen automatische Speicherung Klasse und sind gespeichert in Stapel .

Wenn die Funktion zurückkehrt, wird der Stack abgewickelt und die lokalen Variablen sind nicht mehr zugänglich, aber sie bleiben im Speicher erhalten und das ist der Grund, warum eine Variable in einer Funktion definiert wird, die einen Garbage-Wert enthalten kann.

Es ist nur Stack Pointer Manipulation in Stack und auf Speicher für lokale entfernt wird tatsächlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X