Seite 1 von 1

Pimpl Idiom -> SIGSEGV und/oder SIGABRT Problem

Verfasst: 29. Juni 2008 14:04
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.

Verfasst: 29. Juni 2008 16:04
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

Verfasst: 29. Juni 2008 16:22
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!

Verfasst: 30. Juni 2008 10:40
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 ...