Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Designkonzept Singletons & Valgrind?



7.e.Q
11-01-2006, 08:02
Hi Leute,

ich habe ein kleines Problem hier, weiß nicht, wie ich es angehen soll. Ich benutze für mein Programm das Designkonzept Singletons (Sprache C++; private Konstruktoren; statische Instanzen von sich selbst innerhalb der Klassen; getInstance-Funktionen, die als Rückgabewert eine Referenz auf die Instanz liefern):




class Bla
{
private:
Bla();
~Bla();

public:
static Bla& getInstance()
{
static Bla Instance;
return Instance;
}
};




Okay, funktioniert super. Das hat halt den Vorteil, daß man projektglobal immer Zugriff auf die selbe Instanz einer Klasse hat. Schlecht allerdings, wenn man mehr als eine Instanz benötigt. Aber das ist bei meinem Programm an den meisten Stellen nicht der Fall.

So... das Problem ist jetzt, daß beim Aufruf von getInstance Valgrind mir immer folgende Fehlermeldungen liefert:



==21288== Invalid write of size 4
==21288== at 0x8073D99: CMain::MainLoop(int, char**) (CMain.cxx:49)
==21288== Address 0x52BFEC3C is on thread 1's stack


In Zeile 49 in CMain.cxx ist genau der Aufruf einer getInstance Funktion:


Bla* cBla = &Bla::getInstance();


Also wie kommt das zustande? Wie kann man das beheben?

Danke
Gruß,
Hendrik

7.e.Q
11-01-2006, 08:30
Weitere Infos:

die Fehlermeldungen aus Valgrind treten nicht nur bei getInstance() Aufrufen auf. Auch bei ganz normalen Aufrufen wie



int state_lines = LINES;
state_lines -= 20;


kommt eine Fehlermeldung:


==29254== Invalid write of size 4
==29254== at 0x8073F5E: CMain::MainLoop(int, char**) (CMain.cxx:71)
==29254== Address 0xBED9BBDC is on thread 1's stack


Was hat das zu bedeuten???

7.e.Q
11-01-2006, 11:42
Okay, Analysefehler meinerseits... da kommt ganz am Anfang noch die Fehlermeldung:



Warning: client switching stacks? SP change...


Kann da einer was zu sagen?

Joghurt
11-01-2006, 16:56
Nicht ohne ein Minimalbeispiel, so kurz wie möglich, das denselben Fehler erzeugt.

7.e.Q
11-01-2006, 22:57
Ich hab inzwischen herausgefunden, daß Valgrind diese Fehlermeldungen nicht mehr ausgibt, wenn ich einem bestimmten Parameter (hab ich gerade nicht im Kopf, aber die Aufforderung dazu steht auch in der von Valgrind ausgegebenen Fehlermeldung) einen Wert größer 7000000 mitgebe. Aber so korrekt kann das ja eigentlich nicht sein oder? Hab ich da etwa unsauber programmiert? :rolleyes:

Wenn ich in Minimal-Beispiel liefern könnte, das den selben Fehler verursacht, dann wäre ich, denke ich, auch selbst in der Lage, den Fehler zu analysieren. Danke trotzdem. Konnte ja aber wenigstens die Ausgabe unterdrücken, auch wenn's nicht ganz der korrekte Weg ist. Darum werde ich mich dann später kümmern.

Grundsätzlich schätze ich mal, daß dieser Fehler auftritt, wenn man zu viele zu große Objekte auf dem Stack anlegt. Ich hab das noch nicht ganz verinnerlicht... liege ich richtig mit der These, daß Objekte, die direkt angelegt werden:




class Object;

Object X;

X.Funktion;



auf dem Stack angelegt werden? Irgendwas hatte das doch auch noch mit dem Schlüsselwort static zu tun oder? Das benutze ich ja in Zusammenhang mit dem Designkonzept Singletons... Da werden dann mehrere sehr große Objekte mit static angelegt, um sie programmglobal nutzen zu können, ohne sie wirklich global definieren zu müssen.

Joghurt
11-01-2006, 23:06
static Objekte werden im Datensegment, nicht im Stacksegment angelegt.

(außerhalb Funktionen bedeuetet "int x;" "static int x;" innerhalb "auto int x")

7.e.Q
12-01-2006, 05:40
Ah... was würde denn dann die Warning auslösen? Welche Art Definition legt Objekte auf dem Stack ab?

Joghurt
12-01-2006, 14:16
auto typ variable;

auto is default bei Variablendeklarationen in Codeblöcken.

M.a.W:
void Foo::Bar()
{
Riesenklasse Huuuge;
Huuuuge.waste_of_time();
}hier würde speicher im Stack reserviert.

dann gibt es noch die Funktion "alloca", die aber leider oft so buggy ist, dass von Benutzung abgeraten wird (und seit C++ braucht man sie auch nicht mehr wirklich)

Daher die Frage nach dem Minimalbeispiel, ich sehe nichts in deinem Code, dass zu dieser Warnung führen könnte