这个 shared_ptr 在使用的时候为什么要 reset?

 class Query_result;
class Text_query {
public:
    using line_no = vector<std::string>::size_type;
    Text_query(ifstream&);
    Query_result query(const string&) const;
private:
    shared_ptr<vector<string>> file;
    map<string, shared_ptr<set<line_no>>> wm;//这里
};

Text_query::Text_query(ifstream &is) : file(new vector<string>)
{
    string text;
    while (getline(is, text)) {
        file->push_back(text);
        int n = file->size() - 1;
        istringstream line(text);
        string word;
        while (line >> word)
        {
            auto &lines = wm[word];
            if (!lines)
                lines.reset(new set <line_no>);//这里
            lines->insert(n);
        }
    }
}

《C++ Primer》第五版,中文版。 433 页。书上的解释看不明白。

带参数的reset(使得原指针引用计数减1的同时改为管理另一个指针。

在这里:
 auto &lines = wm[word];
 当wm已有关键字为word的一项时,智能指针已指向一个set<line_no>对象,此时line非空,无需reset;
  当wm没有关键字为word的一项时,智能指针为空,此时line为空,通过reset释放原先的内存空间(此处为空,相当于没有释放),再指向new set <line_no>开辟的内存空间。