>>20
関数で危険なのは、ポインタやレファレンスを返すとき。 特に、関数内部で作られたオブジェクトを
ポインタやレファレンスで返すのは重大な誤り。

この場合のオーバーヘッドが気になるなら、shared_ptrを用いるとよい。 shared_ptrを用いれば
Javaのようにオブジェクトを扱えるのでメモリ管理を気にしなくてよい。 ただし、構文が少し
煩雑になるという欠点を持つ。 *や->演算子を多用するから。

例:
typedef vector<string> VectorString;
typedef shared_ptr<VectorString> RefVectorString;

RefVectorString v(new VectorString());
v->push_back("Hello");
VectorString::iterator it = v->begin();
cout << *it;

RefVectorString f(){
RefVectorString v(new VectorString());
v->push_back("Hello");
return v;
}

RefVectorString v2 = f();
もOK!