Verwirrung mit Pointern

UncleBob

Mitglied
...womit denn auch sonst?

eigentlich hatte ich schon länger keine Probleme damit mehr und dachte ich hätte die Sache begriffen, aber im Moment optimiere ich gerade meinen alten Code und bin über etwas gestolpert das mir überhaupt nicht logisch erscheinen will, was wohl heisst das ich immer noch eine Miskonteption habe. Ich wäre froh wenn mir jemand erläutern könnte WARUM das passiert was da passiert.

Ich habe ein Element, das Sternencluster enthält. Es ist recht gross, somit möchte ich es nicht alzu gerne im Speicher herumkopieren.

Im essentiellen sieht das so aus

Code:
class Cube
{
StarClass **Stars;
.
.
.
.
(viele weitere parameter mehr die hier nicht das problem sind, bei denen ich einfach vermeiden möchte sie kopieren zu müssen)
}

Stars ist ein Array aus pointern. Der Grund dazu ist das es einen Sternenkatalog mit echten Sternen gibt, aber ein Zufallsgenerator die lücken ausfüllt. Die echten Sterne sind permanent im Speicher, und die Pointer im Arrray zeigen darauf. Das Array wird beim Generieren des Clusters gefüllt, aber dann kommen ja noch die Zufallsgenerierten Sterne dazu, was heisst das ich das Array erweitern muss. Und genau da stosse ich auf ein Problem.

In groben zügen sieht meine Alte funktion so aus:
Code:
void CompleteCube(ES_Cluster *Cube, long X, long Y, long Z, float AvgColor)
{

Cube SaveCube;
SaveCube = *Cube; (das ganze Element wird also im Speicher kopiert, was ich genau vermeiden möchte)

Cube->Stars = NULL;
Cube->Stars = new StarClass*[x]; (das Array wird auf die neue grösse gesetzt und danach gefüllt, wobei auch der Inhalt von SaveCube wieder hineingeschrieben wird. Die Funktion dazu ist hier nicht von Belang, weshalb ich sie auch nicht anführe)
}

Nun denn, als ich meinen Code mit optimierungsabsichten durchforstet habe, habe ich mir gedacht dass es eigentlich nonsens ist das ganze Element zu kopieren. Viel besser wäre es doch einfach nur die Soeicheradresse zu holen. Also habe ich folgendes gemacht:

Code:
void CompleteCube(ES_Cluster *Cube, long X, long Y, long Z, float AvgColor)
{

StarClass **SaveStar = Cube->Stars;
SaveStar = Cube->Stars;

Cube->Stars = NULL;
Cube->Stars = new StarClass*[x];
}

Sobald ich aber Cube->Stars neu initialisiere, geht mir der Speicherinhalt von SaveStar flöten, obwohl ich Cube->Stars erst auf NULL setze. Soweit ich die Sache verstanden habe dürfte das doch eigentlich nicht passieren, also habe ich offensichtlich etwas falsch verstanden. Wäre froh wenn mir jemand erklären könnte warum das nicht so geht, und wie ich das Array neu initialisieren kann ohne das der Speicherinhalt dabei draufgeht?
 
Zuletzt bearbeitet:
Hi.
Code:
void CompleteCube(ES_Cluster *Cube, long X, long Y, long Z, float AvgColor)
{

StarClass **SaveStar = Cube->Stars;
SaveStar = Cube->Stars;

Cube->Stars = NULL;
Cube->Stars = new StarClass*[x];
}
Dein Code ist äquivalent zu:
C++:
StarClass **SaveStar = Cube->Stars;
Cube->Stars = new StarClass*[x];
und das ist völlig OK.

Der Fehler liegt woanders.

Gruß
 
uups, habe gar nicht gesehen das ich SaveStar zweimal zugeordnet habe... :P

Interessant. Ich habe das ganze Zeile für Zeile im Debugger verfolgt, und sobald Cube->Stars neu alloziert wird sind alle Pointer in SaveStar ungültig. Werde mir die Sache nochmal ankucken...
 
Zurück