 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ernst Murnleitner Guest
|
Posted: Sat May 19, 2007 5:11 am Post subject: falscher Zeiger auf Member func in Template |
|
|
Hallo,
ich habe da ein komisches Phänomen im Zusammenhang mit templates:
In einem Funktions-Template verwende ich einen Zeiger auf eine
Member-Funktion einer Klasse R. Dieses Template wird in mehreren *.cpp
Dateien verwendet. Nun habe ich in diese Klasse R eine neue Memberfunktion
eingefügt und das Programm ist abgestürzt. Beim Debuggen habe ich gesehen,
dass die falsche Funktion angesprungen wurde. Nach löschen aller
Objektfiles und neuem kompilieren funktionierte wieder alles korrekt. Ich
konnte das noch einmal mit einer andern Kopie nachvollziehen.
Ich habe nun versucht, das Problem mit einem kleinen Testprogramm
nachzuvollziehen, da tritt es nicht auf, da bei allen Änderungen alle
relevanten Dateien durchkompiliert werden (gcc 4.1, KDevelop).
Ich vermute, dass irgendwo eine Instanz des Templates ist, welches
fälschlicherweise bei Änderung der Klasse R nicht neu kompiliert wurde und
daher der Zeiger auf die falsche Adresse zeigt.
Ist das ein Problem mit dem Makefile, wo evt. Abhängigkeiten fehlen könnten
(wurde mit gnu automake erzeugt) oder gibt es in der Tat eine Situation, wo
solch ein Verhalten reproduziert werden kann?
Viele Grüße
Ernst |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Sat May 19, 2007 1:46 pm Post subject: Re: falscher Zeiger auf Member func in Template |
|
|
Ernst Murnleitner wrote:
| Quote: | Hallo,
ich habe da ein komisches Phänomen im Zusammenhang mit templates:
In einem Funktions-Template verwende ich einen Zeiger auf eine
Member-Funktion einer Klasse R. Dieses Template wird in mehreren *.cpp
Dateien verwendet. Nun habe ich in diese Klasse R eine neue Memberfunktion
eingefügt und das Programm ist abgestürzt. Beim Debuggen habe ich gesehen,
dass die falsche Funktion angesprungen wurde. Nach löschen aller
Objektfiles und neuem kompilieren funktionierte wieder alles korrekt. Ich
konnte das noch einmal mit einer andern Kopie nachvollziehen.
Ich habe nun versucht, das Problem mit einem kleinen Testprogramm
nachzuvollziehen, da tritt es nicht auf, da bei allen Änderungen alle
relevanten Dateien durchkompiliert werden (gcc 4.1, KDevelop).
Ich vermute, dass irgendwo eine Instanz des Templates ist, welches
fälschlicherweise bei Änderung der Klasse R nicht neu kompiliert wurde und
daher der Zeiger auf die falsche Adresse zeigt.
Ist das ein Problem mit dem Makefile, wo evt. Abhängigkeiten fehlen
könnten (wurde mit gnu automake erzeugt) oder gibt es in der Tat eine
Situation, wo solch ein Verhalten reproduziert werden kann?
|
Klingt nach ersterem. Vermutlich fehlt irgendwo die Abhängigkeit vom Header,
in dem das Template definiert ist. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon May 21, 2007 1:31 pm Post subject: Re: falscher Zeiger auf Member func in Template |
|
|
On May 19, 2:11 am, Ernst Murnleitner <m...@awite.de> wrote:
| Quote: | ich habe da ein komisches Phänomen im Zusammenhang mit templates:
In einem Funktions-Template verwende ich einen Zeiger auf eine
Member-Funktion einer Klasse R. Dieses Template wird in mehreren *.cpp
Dateien verwendet. Nun habe ich in diese Klasse R eine neue Memberfunktion
eingefügt und das Programm ist abgestürzt. Beim Debuggen habe ich gesehen,
dass die falsche Funktion angesprungen wurde. Nach löschen aller
Objektfiles und neuem kompilieren funktionierte wieder alles korrekt. Ich
konnte das noch einmal mit einer andern Kopie nachvollziehen.
|
Ehelich gesagt, nicht erstaunlich. Du hast die Klasse R
geändert. Das heißt, dass du alle Quellen neu übersetzen musst,
wo sie überhaupt erscheint. (Wenn die Klasse R in einem Header
steht, heißt es, alle Moduln übersetzen, die diese Header auch
indirekt includiert.)
Wenn der Compiler "repositories" benutzt, kann dieses Problem
auch wegen Fehler im Compiler auftauchen. Die zwei gängigsten
Compiler, VC++ und g++, aber benützen keine "repositories".
| Quote: | Ich habe nun versucht, das Problem mit einem kleinen Testprogramm
nachzuvollziehen, da tritt es nicht auf, da bei allen Änderungen alle
relevanten Dateien durchkompiliert werden (gcc 4.1, KDevelop).
Ich vermute, dass irgendwo eine Instanz des Templates ist, welches
fälschlicherweise bei Änderung der Klasse R nicht neu kompiliert wurde und
daher der Zeiger auf die falsche Adresse zeigt.
|
Ich wurde auch darauf tippen.
| Quote: | Ist das ein Problem mit dem Makefile, wo evt. Abhängigkeiten fehlen könnten
(wurde mit gnu automake erzeugt) oder gibt es in der Tat eine Situation, wo
solch ein Verhalten reproduziert werden kann?
|
Wahrscheinlicherweise ein Problem mit dem Makefile. (Obwohl mir
ist so etwas auch einmal passiert, weil die Uhrzeit auf zwei
unterschiedenen Rechnern nicht richtig synchronisiert war.) Hast
tu keinen Ziel "depends", oder so was, damit der Compiler auch
die Abhängigkeiten herstellt.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|