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.

0voto

rui Punkte 10635

In C++ wird jedes Objekt, das Sie in einem Gültigkeitsbereich deklarieren, gelöscht, wenn der Gültigkeitsbereich beendet wird. Im folgenden Beispiel wird der Standardkonstruktor aufgerufen, wenn Sie das Objekt deklarieren, und der Destruktor wird beim Beenden aufgerufen, also ~MyClass.

void foo() {
  MyClass object;
  object.makeWonders();
}

Wenn Sie einen Zeiger in einer Funktion deklarieren, dann wird der Zeiger selbst (die 4 Bytes bei 32-Bit-Systemen) zurückgewonnen, wenn die Funktion beendet wird, aber der Speicher, den Sie möglicherweise mit dem Operator new oder malloc zugewiesen haben, bleibt bestehen - dies wird oft als Speicherleck bezeichnet.

void foo() {
  MyClass* object = new MyClass;
  object->makeWonders();
  // leaking sizeof(MyClass) bytes.
}

Wenn Sie wirklich ein Objekt über new zuweisen müssen, das gelöscht werden muss, wenn es den Geltungsbereich verlässt, sollten Sie boost::scoped_ptr wie folgt verwenden:

void foo() {
  boost::scoped_ptr<MyClass> object(new MyClass);
  object->makeWonders();
  // memory allocated by new gets automatically deleted here.
}

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