On 07/08/2017 07:10 PM, Phil Bouchard via Boost wrote:
Hello Boost / Qt,
After some experience I have gained in Javascript over the last year, I decided to integrate root_ptr in a quest to replace their garbage collector.
So I did and I already have an example. If we mimic the Javascript function scope in C++ then we'll have the following: https://github.com/philippeb8/root_ptr/blob/develop/example/javascript_examp...
The application was compiled with: g++ -fpermissive -DBOOST_DISABLE_THREADS -std=c++11 -I../include -I/usr/local/include -L/usr/local/lib -lboost_thread -lboost_system javascript_example1.cpp
And it outputs: Scope 0: BEGIN Scope 1: BEGIN A::A(const boost::node_proxy&) A::A(const boost::node_proxy&) A::~A() Scope 1: END A::~A() Scope 0: END
Which is exactly what we want. Note that I didn't stress tested it yet and in Brave New World we would be able to integrate it to other languages relatively easily given Javascript is a worse-case scenario.
I just made the example more complex and I am using a cycle: struct A { node_ptr<A> i; node_ptr<int> j; [...] }; int main() { cout << "Scope 0: BEGIN" << endl; { node_proxy x; node_ptr<A> a(x); cout << "Scope 1: BEGIN" << endl; { node_proxy x; node_ptr<A> b = make_node<A>(x, x, "b1"); node_ptr<A> c = make_node<A>(x, x, "c1"); a = b; b = make_node<A>(x, x, "b2"); b->i = b; } cout << "Scope 1: END" << endl; } cout << "Scope 0: END" << endl; } And now I have: Scope 0: BEGIN Scope 1: BEGIN A::A(const boost::node_proxy&, const char*): b1 A::A(const boost::node_proxy&, const char*): c1 A::A(const boost::node_proxy&, const char*): b2 A::~A(): c1 A::~A(): b2 Scope 1: END A::~A(): b1 Scope 0: END That is flawless... If anybody is willing to fool this memory manager then please go ahead! -Phil