Frage

Beim Stöbern im Internet bin ich auf Folgendes gestoßen dieser Beitrag, was dies beinhaltet

"(Gut geschrieben) C ++ unternimmt große Anstrengungen, damit die automatischen Objekte von Stapel so funktionieren" wie "Primitive, wie sich in StrouStrups Rat zum" tun, wie die INTs tun ".Dies erfordert eine viel größere Einhaltung der Prinzipien der objektorientierten Entwicklung:Ihre Klasse ist nicht richtig, bis sie "wie" und "funktioniert", der der "Regel von drei" befolgt, die garantiert, dass sie (genau wie ein int) erstellt, kopiert und korrekt als Stapel automatisch zerstört werden kann. "

Ich habe ein wenig C- und C++-Code gemacht, aber nur nebenbei, nie etwas Ernstes, sondern ich bin nur neugierig, was das genau bedeutet?

Kann jemand ein Beispiel geben?

War es hilfreich?

Lösung

Stapelobjekte werden vom Compiler automatisch verarbeitet.

Beim Verlassen des Bereichs wird dieser gelöscht.

{
   obj a;
} // a is destroyed here

Wenn Sie dasselbe mit einem „neuen“ Objekt tun, kommt es zu einem Speicherverlust:

{
    obj* b = new obj;
}

b wird nicht zerstört, daher haben wir die Möglichkeit verloren, den Speicher zurückzugewinnen, den b besitzt.Und vielleicht noch schlimmer: Das Objekt kann sich nicht selbst reinigen.

In C ist Folgendes üblich:

{
   FILE* pF = fopen( ... );
   // ... do sth with pF
   fclose( pF );
}

In C++ schreiben wir Folgendes:

{
   std::fstream f( ... );
   // do sth with f
} // here f gets auto magically destroyed and the destructor frees the file

Wenn wir im C-Beispiel vergessen, fclose aufzurufen, wird die Datei nicht geschlossen und darf nicht von anderen Programmen verwendet werden.(z.B.es kann nicht gelöscht werden).

Ein weiteres Beispiel, das die Objektzeichenfolge demonstriert, die erstellt, zugewiesen und beim Verlassen des Bereichs zerstört werden kann.

{
   string v( "bob" );
   string k;

   v = k
   // v now contains "bob"
} // v + k are destroyed here, and any memory used by v + k is freed

Andere Tipps

Zusätzlich zu den anderen Antworten:

Die C++-Sprache hat tatsächlich das auto Schlüsselwort, um die Speicherklasse eines Objekts explizit zu deklarieren.Das ist natürlich völlig unnötig, da es sich um die implizite Speicherklasse für lokale Variablen handelt und nirgendwo verwendet werden kann.Das Gegenteil von auto Ist static (sowohl lokal als auch global).

Die folgenden beiden Deklarationen sind äquivalent:

int main() {
    int a;
    auto int b;
}

Da das Schlüsselwort völlig nutzlos ist, wird es tatsächlich im nächsten C++-Standard („C++0x“) wiederverwendet und erhält eine neue Bedeutung, nämlich, dass es dem Compiler ermöglicht, den Variablentyp aus seiner Initialisierung abzuleiten (z. B var in C#):

auto a = std::max(1.0, 4.0); // `a` now has type double.

Variablen in C++ können entweder auf dem Stack oder dem Heap deklariert werden.Wenn Sie eine Variable in C++ deklarieren, wird sie automatisch auf den Stapel gelegt, es sei denn, Sie verwenden explizit den new-Operator (sie landet auf dem Heap).

MyObject x = MyObject(params); // onto the stack

MyObject * y = new MyObject(params); // onto the heap

Dies macht einen großen Unterschied in der Art und Weise, wie der Speicher verwaltet wird.Wenn eine Variable auf dem Stapel deklariert wird, wird ihre Zuordnung aufgehoben, wenn sie den Gültigkeitsbereich verlässt.Eine Variable auf dem Heap wird nicht zerstört, bis delete explizit für das Objekt aufgerufen wird.

Bei der Stapelautomatik handelt es sich um Variablen, die auf dem Stapel der aktuellen Methode zugewiesen werden.Die Idee hinter dem Entwerfen einer Klasse, die automatisch als Stack fungieren kann, besteht darin, dass es möglich sein sollte, sie mit einem Aufruf vollständig zu initialisieren und mit einem anderen zu zerstören.Es ist wichtig, dass der Destruktor alle vom Objekt zugewiesenen Ressourcen freigibt und sein Konstruktor ein Objekt zurückgibt, das vollständig initialisiert und einsatzbereit ist.Ähnliches gilt für den Kopiervorgang: Von der Klasse sollten problemlos Kopien erstellt werden können, die voll funktionsfähig und unabhängig sind.

Die Verwendung einer solchen Klasse sollte ähnlich sein wie bei primitiven int, float usw.werden verwendet.Sie definieren sie (geben ihnen schließlich einen Anfangswert), geben sie dann weiter und überlassen am Ende dem Compiler die Bereinigung.

Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, dass der Kopiervorgang nicht zwingend erforderlich ist, um die automatische Stapelbereinigung voll auszunutzen.Stellen Sie sich zum Beispiel ein klassisches MutexGuard-Objekt vor. Es benötigt keinen Kopiervorgang, um als Stapelautomatik nützlich zu sein, oder doch?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top