Pimpl Idiom -> SIGSEGV und/oder SIGABRT Problem

Alles rund um die Programmierung mit Qt
Antworten
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Pimpl Idiom -> SIGSEGV und/oder SIGABRT Problem

Beitrag von hilefoks »

Moin,

nachdem ich einige Header meines Projekts entschlackt habe schlugen plötzlich meine Unit-Tests fehl. Allerdings anders als erwartet mit einem segmentation fault.

Der SIGSEGV wird beim Aufruf der Destruktoren und durch QString (genauer qatomic_i386.h) ausgeloest.
Allerdings verstehe ich bisher nicht warum.

Daher habe das ganze mal auf ein kleines Beispielprogramm heruntergebrochen.

Code: Alles auswählen

#include <QString>
#include <QList>

struct FooData {
    QString m_str;
};

class Foo {
  public:
    Foo() : d(new FooData) { }
    ~Foo() { delete d; }

  private:
    FooData *d;
};

struct BarData {
    QList<Foo> m_foolist;
};

class Bar {
  public:
    Bar() : d(new BarData()) { } 
    ~Bar() { delete d; }

    void addFoo(const Foo &f) { 
      d->m_foolist.append(f); 
    }
    
  private:
    BarData *d;
}; 

int main() {
    Foo f1;
    Bar b;
    b.addFoo(f1);
};
Kommentiere ich in FooData den QString aus, so erhalte ich keinen SIGSEGV sondern einen SIGABRT.

Kann mir jemand erklaeren was hier falsch laeuft?

MfG,
Hilefoks

P.S: Ich verwende Qt 4.4.0 auf Linux.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das hat aber nun wirklich nichts mit Qt zu tun :)
Foo hat keinen copy-ctor. Allerdings fügst Du in die QList<foo> eine Copy ein (geht ja nun nicht anders , außer man benutzt QList<foo*>). Was beim default-copy ctor passiert kannst Du Dir ja selbst überlegen. Wenn man schon pimpl benutzen will sollte man auch alles dazu lesen :D
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Beitrag von hilefoks »

Oh Gott - Ich Idiot hab es tatsaechlich einmal vergessen (im meinem echten Code) und diesen Fehler gleich in mein Beispiel uebernommen ohne es zu sehen... peinlich, peinlich!

Sorry und Danke!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

um sowas zu vermeiden, nimmt man beim pimpl auch keinen rohen pointer, sondern nen smartpointer mit besitzsemantik und den am besten constant ...

std::auto_ptr oder das entsprechende gegenstueck aus der tr1 ....

Ciao ...
Antworten