Forum: PC-Programmierung C# - Benutzen nicht referenzierte Objekte bereits Speicherplatz ?


von Marco K. (mbc)


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

von (prx) A. K. (prx)


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 "=".

von Mars (Gast)


Lesenswert?

1
Circle meinKreis;
Ist eine Referenz auf ein Circle Objekt. Diese belegt als lokale 
Variable je nach Architektur 4 bis 8 Bytes am Stack, also wesentlich 
weniger als das eigentliche Objekt.

von Ulrich (Gast)


Lesenswert?

sicher? dann wäre es aber ein Pointer....

von Mars (Gast)


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.

von Sven P. (Gast)


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.

von Marco K. (mbc)


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 !

von Mars (Gast)


Lesenswert?

> Das wäre dann doch totale Anarchie?!

Inwiefern? C# ist eben nicht C++

von Sven P. (Gast)


Lesenswert?

Naja, wenn "Circle x;" schon eine Referenz ist, wie unterscheidet es 
sich denn dann von einem Objekt/einer Struktur?

Aber du hast Recht, in C# ist das tatsächlich so undurchsichtig (wie ich 
finde, aber naja) gelöst:
http://www.aspheute.com/artikel/20000726.htm

von daniel (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.