
Hello, I was fooling around with the boost::shared_ptr and boost::weak_ptr library and dynamic libraries and I received a segmentation fault which I do not fully understand and I am hoping someone can shed some light on the situation. I am playing around with having objects in a dynamic library which are managed by shared_ptr's return weak_ptrs to the application My problem arises when the weak_ptrs aren't destroyed before the plugin is unloaded. I was hoping that the weak_ptr would become invalid when the shared_ptr it points to is unloaded but instead it causes a segmentation fault. I'm just starting to play around with dynamic libraries and shared_ptrs and stuff so I don't fully understand all the caveats that go with the territory so any information would be appreciated. Here's a small linux example which generates the error: main.cc == Application foo.cc/foo.hh == Dynamic Library make sure to set LD_LIBRARY_PATH to the appropriate directory main.cc ======= #include <iostream> #include <dlfcn.h> #include <boost/weak_ptr.hpp> #include "Foo.hh" using namespace std; int main() { typedef boost::weak_ptr<Foo> (*DoStuff) (void); void *hndl = dlopen("libFoo.so", RTLD_NOW); void *doStuff = dlsym(hndl, "doStuff"); // { //if I comment this in then the error goes away boost::weak_ptr<Foo> wpFoo = ((DoStuff)(doStuff))(); // } //if I comment this in then the error goes away dlclose(hndl); cerr << "Yay Finished" << endl; return 0; } Foo.hh ====== #ifndef FOO_HH #define FOO_HH #include <boost/weak_ptr.hpp> class Foo { }; extern "C" { boost::weak_ptr<Foo> doStuff(); } #endif //FOO_HH Foo.cc ====== #include "Foo.hh" #include <vector> #include <boost/shared_ptr.hpp> std::vector<boost::shared_ptr<Foo> > Foos; extern "C" { boost::weak_ptr<Foo> doStuff() { Foos.push_back(boost::shared_ptr<Foo>(new Foo)); return Foos[0]; } } Makefile ======== CC = g++ LIBS = -ldl .cc.o: $(CC) -ggdb -c $< default: make all OBJS = main.o test: main.o $(CC) -rdynamic -o test main.o $(LIBS) libfoo.so: Foo.o g++ -shared -Wl,-soname,libFoo.so -o libFoo.so Foo.o all: test libfoo.so clean: rm -f *.so *.o test === end of example thanks Kyle