Warum verursacht Pointer SIGSEGV in Funktion?

Ich habe ein globales Array aus Pointern

MyClass* foo[MAXVAL];

folgender Code funktioniert zwar in main(), verursacht aber SIGSEGV in einer anderen Funktion:

foo[0] = new MyClass(1);

Kann mir jemand erklären warum, bzw wie ich dies lösen kann?

howdy,

MyClass* foo[MAXVAL];
folgender Code funktioniert zwar in main(), verursacht aber
SIGSEGV in einer anderen Funktion:
foo[0] = new MyClass(1);

das liegt mit grosser Wahrscheinlichkeit nicht an dem new, sondern an einem Speicherüberschreiber, der woanders passiert.

Gruss
norsemanna

Hossa :smile:

Das sieht so eigentlich richtig aus. Was macht denn der Konstruktor deiner Klasse? Schreibt der irgendwo wild im Speicher rum?

Viele Grüße

Hase

Guten Tag,

Hallo

Der Constructor „kreiert“ die membervariablen:

class MyClass
{
char* num;
int size;

public:
MyClass(int numsize)
{
num = new char[numsize];
memset(num, 0, sizeof(num)*numsize);
size = numsize;
}

};

Wie auch immer, wenn gebraucht in main() scheint das *immer* zu funktionieren und innerhalb einer Funktion *garnicht*. Das macht für mich keinen Sinn…

cheers

Hossa :smile:

Auch das sieht gut aus. Zeig mal bitte den Copy-Constructor, vielleicht geht ja was beim Kopieren des Klassenobjektes beim Verlassen der Funktion daneben.

Viele Grüße

Hase

Auch das sieht gut aus. Zeig mal bitte den Copy-Constructor,
vielleicht geht ja was beim Kopieren des Klassenobjektes beim
Verlassen der Funktion daneben.

Uh, das wirds wohl sein. Ich hab gar keinen definiert, bzw. mich noch gar mit sowas befasst. Kurze Recherche sagt mir dass ich mit grosser Wahrscheinlichkeit auch den operator= überschreiben soll. Wie dies in beiden Fällen mit den Pointern handzuhaben ist weiss ich allerdings (noch?) nicht,… mal sehen ob ich was finde.

Vielen Dank für die Antwort(en) :wink:

Guten Tag,

dito

Man korrigiere mich, wenn ich mich irre, aber das hier:

// sinngemäß:
int numsize = 1;

char\* num;
num = new char[numsize];
memset(num, 0, sizeof(num)\*numsize);

sieht nicht gut aus.

‚num‘ ist ein pointer, d.h. sizeof(num) liefert den Speicherbedarf eines Zeigers, nicht des Typs, auf den ‚num‘ zeigt.
Wenn Du nur ein Element allokierst, schreibt memset() über das Ende des angeforderten Bereichs hinaus.

Besser so:

memset(num, 0, sizeof(char)\*numsize);

Gruß,
Ralf

Man korrigiere mich, wenn ich mich irre, aber das hier:

// sinngemäß:
int numsize = 1;

char* num;
num = new char[numsize];
memset(num, 0, sizeof(num)*numsize);

sieht nicht gut aus.

Besser so:

memset(num, 0, sizeof(char)*numsize);

Offensichtlich hast du recht. Funktioniert jetzt jedenfalls.
Dank auch an dich :smile: