valgrindでプログラムを調べてたら怒られて気づいたんだが、 shared_ptr<T>(new T[n])のようにshared_ptrで配列を持つと消すときにdelete pが呼ばれるので問題である。 new T[n]でつくった配列はdelete[] pで消さないといけない。 boostにはshared_arrayというものがあるらしいが、そういうのはtr1の下にないので、 こんなdeleterをつくって回避した。
template <typename T>
struct array_deleter
{
    void operator()(T* p) const { delete[] p; }
};
void
f()
{
    shared_ptr<int> p (new int[999], array_deleter<int>());
}