/* * Testcase causing segmentation fault under Cygwin and Linux * Boris Schaeling (boriss@web.de) * * Compile: g++ -otestcase testcase.cpp * Run: ./testcase */ #include #include extern "C" { #include } /* ********** observer_base & observer ********** */ class observer_base { public: virtual void run(void) { } }; class observer : public observer_base { public: observer(); void run(void) { std::cout << "Hello" << std::endl; } }; /* ********** adapter_base & adapter ********** */ class adapter_base { protected: observer_base *Observer; public: virtual void set_observer(observer_base *O) { Observer = O; } virtual void run(void) { } }; class adapter : public adapter_base { public: void run(void) { Observer->run(); } /* <--- SEGMENTATION FAULT?! */ }; /* ********** select_data & select ********** */ class select_data { public: adapter_base *Adapter; select_data() { } select_data(adapter_base *A) : Adapter(A) { } void run(void) { Adapter->run(); } }; class select { private: adapter Adapter; select_data Data[1]; std::list Observers; /* <--- CHANGE THIS TO: observer *Observer; */ public: select() { select_data data(&Adapter); Data[0] = data; Observers.push_back(observer()); /* <--- AND CHANGE THIS TO: Observer = new observer; AND EVERYTHING WORKS */ } void give(observer_base *O) { Data[0].Adapter->set_observer(O); } void run(void) { poll(NULL, 0, 2000); /* <--- OR REMOVE THIS LINE AND EVERYTHING WORKS */ Data[0].run(); } }; /* ********** something else ********** */ class select Select; observer::observer() { Select.give(this); } /* ********** main ********** */ int main() { Select.run(); }