C# - Benutzen nicht referenzierte Objekte bereits Speicherplatz ?

#1085339
Lesenswert?

Ich habe ein Objekt:
1
Circle meinKreis;

benutzt dieses Objekt jetzt schon Speicherplatz oder reserviert diesen?
Ich habe nämlich folgendes Problem:

Ich möchte eine Klasse erstellen die eine große Anzahl an Objekten 
enthält.
Je nach Parameterübergabe wird jedoch nur eine gewisse Anzahl an 
Objekten benötigt.
Da ich aufgrund der großen Anzahl an Objekten angst habe den Speicher 
zuzumüllen möchte ich darauf achten.

Programm sähe in etwa so aus (Beispielcode):
1
public void (int zahl)
2
{
3
    Circle meinKreis;
4
    Circle ovale;
5

6
    if(zahl==1)
7
    {
8
      meinKreis = new Circle();
9
      //befüllen
10
    }
11

12
}

Soweit wüßte ich mir da als Anfänger glauben behelfen zu können.
Geht das so OHNE unnötig Speicherplatz zu reservieren oder zu 
verschwenden, oder ist da eine anderes herangehensweise notwendig?

Da ich "ovale" ja nicht benötige braucht es ja auch keinen Speicherplatz 
zu verwenden.

Danke für Eure Ratschläge Tips und Hinweise

MFG
#1085353
Lesenswert?

Marco K. wrote:

>     Circle meinKreis;

Ist ein Objekt, das während der Dauer seiner Sichtbarkeit, also zur 
Laufzeit der Funktion, Platz auf dem Stack belegt.

>       meinKreis = new Circle();

Weist einem Objekt die Adresse eines Objektes zu. Gibt üblicherweise 
eine Fehlermeldung aufgrund inkompatibler Datentypen beiderseits "=".
Gast #1085472
Lesenswert?

In C# werden Pointer als Referenzen bezeichnet, da auf Referenzen nur 
mehr die Operatoren == und != angewandt werden dürfen.
Pointer wie es sie in C gibt gibt es in C# nur in usafe-Blöcken und 
diese werden nur sehr selten, bis nie gebraucht.

Ich bin allerdings in meinem ersten Post davon ausgegangen, das es sich 
beim Typ Circle um eine Klasse handelt. Wäre Circle ein struct, würde 
das ganze Objekt in diesem Fall am Stack angelegt werden.
Gast #1085484
Lesenswert?

Das wäre dann doch totale Anarchie?!

Wenn "MeineKlasse" eine Klasse ist (die Klasse selbst, nicht irgendeine 
typedef-Konstruktion), dann ist "MeineKlasse a;" ein Objekt der Klasse 
und belegt soviel Speicher, wie die Klassenvariablen und so weiter 
benötigen.

Dagegen würde "MeineKlasse *a;" dann nur soviel Speicher belegen, wie 
ein Zeiger braucht.

Und schließlich wäre "MeineKlasse &a = ...;" dann eine Referenz, die 
prinzipiell auch nur Speicher für einen Zeiger braucht.
#1085485
Lesenswert?

Jo, SORRY, mein Fehler, Circle ist in dem Fall wirklich eine Klasse, 
hätte ich zusätzlich erwähnen sollen.

Struct wäre klar, würde sofort angelegt werden.

Ich habe es also richtig verstanden, das hier quasi nur ein "Verweis" 
auf die Objektart" angelegt wird (also eine "Art" ""pointer"")), das 
Objekt aber noch nicht erzeugt wird und somit erstmal noch keinen 
zusätzlichen Speicher erzeugt, außer halt dem Verweis.

Erst der "new" Operator legt es an und erst ab DANN wird auch wirklich 
der Speicher dafür reserviert ...

Soweit wäre für mich schonmal alles OK, dann kann ich es ja so machen.

Ich danke Euch für Eure Hilfe !
Gast #1086002
Lesenswert?

>Circle meinKreis;

>benutzt dieses Objekt jetzt schon Speicherplatz oder reserviert diesen?

nein, erst new "stellt einen Antrag auf Speicher"
dieser Antrag kann abgeschossen werden => exception no memory whatever

wie andere gesagt haben, ist es bei struct anders!

und in C++ würde es bereits Speicher beanspruchen, dafür
stellt C++ pointer Konzept wenn man andere Semantik möchte

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren