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?
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
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
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)
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