12.6
vector<int >* createVec(){ return new vector<int>; } void getCinToVectore(istream& in, vector<int >& vec){ int i = 0; while (in >> i) { vec.push_back(i); } } void printElements(const vector<int >& vec) { for(auto vecE : vec){ cout << vecE << endl; } delete &vec; } int main() { vector<int > * vecPoint = createVec(); getCinToVectore(cin, *vecPoint); printElements( *vecPoint); for (;;); return 0; }
12.7
shared_ptr<vector<int >> createVec(){ return make_shared<vector<int >>(); } void getCinToVectore(istream& in, vector<int >& vec){ int i = 0; while (in >> i) { vec.push_back(i); } } void printElements(const vector<int >& vec) { for(auto vecE : vec){ cout << vecE << endl; } } int main() { shared_ptr<vector<int >> vecPoint = createVec(); getCinToVectore(cin, *vecPoint); printElements( *vecPoint); for (;;); return 0; }
12.8
函数中申请了一块动态内存,却没有释放他,在函数结束后程序将无法释放这块内存,会导致内存泄漏
12.9
动态内存 new int(100)在r=q之后,这块内存将无法释放,会导致内存泄露,
动态指针在r2=q2时候,自动释放make_shared<int>(100)的内存
12.10
正确
12.11
不正确,在process函数结束之后,p指针会被释放,导致空悬指针
12.12
a.传入一个sp,合法传入
b.不合法,不能将内置指针隐式转换成智能指针
c.同上不合法,p是一个内置指针
d.合法,传入了一个临时的智能指针
12.13
sp和p同时指向了同一块指针,当p被释放时,sp也会被释放,但是智能指针仍然存在,当sp使用结束(即使使用时就已经是空悬指针),那块内存会再次被释放,当再次使用sp或退出sp当前作用域时候都会抛出异常
12.14
struct destination; struct connection; connection connect(destination*); void disconnect(connection); void end_connection(connection* p){ disconnect(*p); } void f(destination& d){ connection c = connect(&d); shared_ptr<connection >(&c, end_connection); }
12.15
struct destination; struct connection; connection connect(destination*); void disconnect(connection); void end_connection(connection* p){ disconnect(*p); } void f(destination& d){ connection c = connect(&d); shared_ptr<connection >(&c, [](connection* c_p){disconnect(*c_p);}); }