
Jonas Persson wrote:
The following example gives an access violation on windows:
---------------------------------------------- class Foo : public gc_object<Foo> { public: gc_ptr<Foo> m_next; std::string m_name;
Foo(std::string name) : m_name(name) {}
~Foo() { m_next->lastGoodbye(); }
void lastGoodbye() { std::cout << "Bye " << m_name; } }; void test_cycle() { gc_ptr<Foo> foo1 = new Foo("foo 1"); foo1->m_next = new Foo("foo 2"); foo1->m_next->m_next = foo1;
foo1 = 0; gc::collect(); }
So that library overloads operator new, meaning all memory becomes garbage collected, unlike what I understood from what was answered to one of my other posts. I even wonder how gc_ptr<T>::gc_ptr::(T*) can be a safe constructor at all. A fairly terrible design, that has a lot of shortcomings, some of which where raised when talking of Boehm GC (basically, bad integration). The funny thing is that the right way to do GC in C++ has been known for a long time, but for some reason people still want to do it some other way. C++/CLI, despite its evilness, does it right. Bastek's library (SGCL) seems to do it somewhat right too.