问题描述
- 这个 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 页。书上的解释看不明白。
解决方案
在这里:
auto &lines = wm[word];
当wm已有关键字为word的一项时,智能指针已指向一个set<line_no>对象,此时line非空,无需reset;
当wm没有关键字为word的一项时,智能指针为空,此时line为空,通过reset释放原先的内存空间(此处为空,相当于没有释放),再指向new set <line_no>开辟的内存空间。
解决方案二:
带参数的reset(使得原指针引用计数减1的同时改为管理另一个指针。
解决方案三:
使用 shared_ptr
C++中shared_ptr的使用
shared_ptr使用
时间: 2024-09-06 20:47:18