What is the best practice when returning a smart pointer, for example a boost::shared\_ptr? Should I by standard return the smart pointer, or the underlying raw pointer? I come from C# so I tend to always return smart pointers, because it feels right. Like this (skipping const-correctness for shorter code): 

```
class X
{
public:
    boost::shared_ptr<Y> getInternal() {return m_internal;}

private:
    boost::shared_ptr<Y> m_internal;
}

```

However I've seen some experienced coders returning the raw pointer, and putting the raw pointers in vectors. What is the right way to do it?