Question: Could someone explain to a C++ programmer most important differences between Java (and C# as well) references and shared\_ptr (from Boost or from C++0x).

I more or less aware how shared\_ptr is implemented. I am curious about differences in the following ares:

1) Performance.
2) Cycling. shared\_ptr can be cycled (A and B hold pointers to each other). Is cycling possible in Java?
3) Anything else?

Thank you.

Answer: 
Nobody pointed the possibility of moving the object by the memory manager in managed memory. So in C# there are no simple references/pointers, they work like IDs describing object which is returned by the manager.  

In C++ you can't achieve this with shared\_ptr, because the object stays in the same location after it has been created.
First of all, Java/C# have only pointers, not references, though they call them that way. Reference is a unique C++ feature. Garbage collection in Java/C# basically means infinite life-time. `shared_ptr` on the other hand provides sharing and deterministic destruction, when the count goes to zero. Therefore, `shared_ptr` can be used to automatically manage any resources, not just memory allocation. In a sense (just like any RAII design) it turns pointer semantics into more powerful value semantics.