[c++] Speicherzugriffsfehler durch Pointer?

cyberschaf

Grünschnabel
Hallo zusammen, ich sitze inzwischen seit 3 Stunden an meinem Problem und weiß nicht mehr weiter. Habe alles mögliche ausprobiert, komme aber nicht voran.
Deshalb hoffe ich, dass mir jemand helfen kann.


Der Code ist folgender:
Code:
Kraftwerk *test;
test = new Kraftwerk("Affe");
cout << test->gib_test();

Das wirft einen Fehler, genauso wie andere Zugriffe. Allerdings wird der Konstruktor aufgerufen und der Parameter "Affe" übergeben und gib_name() funktioniert auch. Wieso auch immer...
Habe bereits mit totalview und valgrind versucht selber was herauszufinden, es entzieht sich aber komplett meiner Kenntnis, was da abläuft.

Hier die Klassen noch:

kraftwerk.cpp
Code:
#include "kraftwerk.h"

Kraftwerk::Kraftwerk(const string & name):Objekt()
{
	this->KWname=name;
	cout << name;
}

static CKlasse Kraftwerk_Beschr("Kraftwerk",KRAFTWERK);

CKlassenBeschr KRAFTWERK = &Kraftwerk_Beschr;

const CKlassenBeschr& Kraftwerk::klassen_beschr() const
{
   return KRAFTWERK;
}

bool Kraftwerk::ist_ein(CKlassenBeschr beschr) const
{
   return (beschr == KRAFTWERK||Objekt::ist_ein(beschr));
}

void Kraftwerk::print(ostream &stream) const
{
}

Kraftwerk::~Kraftwerk()
{
}

kraftwerk.h
Code:
#ifndef KRAFTWERK_H_
#define KRAFTWERK_H_

#include "allg.h"
#include "cobjekt.h"

class Kraftwerk:public Objekt
{
private:
	string KWname;
public:
	Kraftwerk(const string & name);	
	
	virtual const CKlassenBeschr& klassen_beschr() const;

	virtual bool ist_ein(CKlassenBeschr beschr) const;

	virtual void print(ostream &stream = cout) const;
	
	virtual string gib_name() { return KWname; };
	
	virtual string gib_test() { return KWname; };
	
	virtual ~Kraftwerk();
};

extern CKlassenBeschr KRAFTWERK;

#endif /*KRAFTWERK_H_*/

Die Klassenbeschreibungen usw. bitte ignorieren, die brauche ich nur zum Fehler abfangen, sind aber prinzipiell nur kopiert und sollten so funktionieren. "Objekt" ist die Standardklasse, von der hier alles abgeleitet wird. Funktioniert normalerweise auch super, allerdings in diesem Fall nicht.

Valgrind sagt mir folgende Fehlermeldung (vielleicht hilft die ja):
Code:
==31619== Jump to the invalid address stated on the next line
==31619==    at 0x4D433131: ?
==31619==    by 0x805DB4F: main (main.cpp:76)
==31619==  Address 0x4d433131 is not stack'd, malloc'd or (recently) free'd
==31619==
==31619== Process terminating with default action of signal 11 (SIGSEGV)
==31619==  Access not within mapped region at address 0x4D433131
==31619==    at 0x4D433131: ?
==31619==    by 0x805DB4F: main (main.cpp:76) [Anmerkung: main.cpp:76 ruft die Klasse auf, in der das erste Codeschnippsel steht]
==31619==  If you believe this happened as a result of a stack overflow in your
==31619==  program's main thread (unlikely but possible), you can try to increase
==31619==  the size of the main thread stack using the --main-stacksize= flag.
==31619==  The main thread stack size used in this run was 8388608.
Affe==31619==
==31619== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 5 from 1)
==31619== malloc/free: in use at exit: 16,757 bytes in 316 blocks.
==31619== malloc/free: 863 allocs, 547 frees, 77,560 bytes allocated.
==31619== For counts of detected errors, rerun with: -v
==31619== searching for pointers to 316 not-freed blocks.
==31619== checked 44,282,812 bytes.
==31619==
==31619== LEAK SUMMARY:
==31619==    definitely lost: 0 bytes in 0 blocks.
==31619==      possibly lost: 8,057 bytes in 204 blocks.
==31619==    still reachable: 8,700 bytes in 112 blocks.
==31619==         suppressed: 0 bytes in 0 blocks.
==31619== Rerun with --leak-check=full to see details of leaked memory.
Speicherzugriffsfehler

Vielen Dank jedenfalls schon mal für die Hilfe! :)
 
Hallo,

Ich kenn mich mit "virtual" nicht so aus, aber benutzt man das nicht nur wenn man eine bereits vorhandene Funktion überschreib?

Versuch das ganze mal ohne" virtual" bei gib_test().

Gruß
Anfänger
 
Daran lag es leider nicht, das habe ich schon vorher ausprobiert. Allerdings hätte es mich auch gewundert, wenn es daran liegen würde, habe ja keine Klassen abgeleitet (habe davon generell keine Klassen abgeleitet), die diese Funktion nutzen würden.
 
Hi.

Dein Codeausschnitt ist unzureichend. (was ist denn Zeile 76?)

Mach mal ein vollständiges Minimalbeispiel was man kompilieren kann.

Gruß
 
Kann kein Codebeispiel erstellen, was nicht funktioniert. Habe mal die Kraftwerksklassen in ein neues Projekt kopiert, an denen liegt es nicht.
Muss dann noch mal jemanden fragen, der sich das vor Ort angucken kann. Die entsprechenden Oberklassen sind nicht öffentlich, die kann ich deshalb nicht hier posten.

Trotzdem danke für die Hilfe.

€: Hat sich erledigt, der Fehler war so dämlich, dass ich mich gar nicht traue, den zu posten. Habe aus der main.cpp die Klasse aufgerufen, allerdings ohne sie zu initialisieren. Damit waren alle Zugriffe innerhalb der Klasse mit einem Speicherzugriff verbunden.
 
Zuletzt bearbeitet:
Zurück