16.21 编写你自己的DebugDelete版本。
#include<iostream> #include<new> using namespace std; class DebugDelete { public: DebugDelete(ostream &s=cerr):os(s) {} template <typename T> void operator()(T *p) const { os<<"deleting unique_ptr "<<endl; delete p; } private: ostream &os; }; int main() { double *p=new double; DebugDelete d; d(p); int *ip=new int; DebugDelete()(ip); return 0; }
16.22 修改TextQuery程序,令shared_ptr成员使用DebugDelete作为它们的删除器。
TextQuery.h
#ifndef TEXTQUERY_H #define TEXTQUERY_H #include<iostream> #include<string> #include<fstream> #include<vector> #include<memory> #include<map> #include<set> #include<new> #include"DebugDelete.h" using namespace std; class QueryResult; class TextQuery { public: using line_no=vector<string>::size_type; TextQuery(ifstream&); QueryResult query(const string&) const; ~TextQuery() { //DebugDelete()(new vector<string>); cout<<"destructing...."<<endl; } private: shared_ptr<vector<string>> file; map<string,shared_ptr<set<line_no>>> wm; }; #endif // TEXTQUERY_H
TextQuery.cpp
#include"TextQuery.h" #include"QueryResult.h" #include<sstream> TextQuery::TextQuery(ifstream& is):file(new vector<string>,DebugDelete()) { string text; while(getline(is,text)) { file->push_back(text); int n=file->size()-1; string word; istringstream line(text); while(line>>word) { auto &lines=wm[word]; if(!lines) lines.reset(new set<line_no>); lines->insert(n); } } } QueryResult TextQuery::query(const string& sought) const { static shared_ptr<set<line_no>> nodata(new set<line_no>); auto loc=wm.find(sought); if(loc!=wm.end()) return QueryResult(sought,loc->second,file); else return QueryResult(sought,nodata,file); }
DebugDelete.h
#include<iostream> #include<new> using namespace std; class DebugDelete { public: DebugDelete(ostream &s=cerr):os(s) {} template <typename T> void operator()(T *p) const { os<<"deleting shared_ptr "<<endl; delete p; } private: ostream &os; };