//练习12.10-11 shared_ptr p(new int(42));//process(p);//process(shared_ptr (p)); //用p来初始化创建一个临时的智能指针 //也指向p所指向的内存 process(shared_ptr (p.get())); //用p.get()返回的内置指针来初始化创建一个 //临时的智能指针,指向p所指向的内存 //当离开process函数的作用域时,这个临时智能指针会被销毁 //其所指向的内存也被释放掉 //因为调用结束后指向这块内存的智能指针数为0 //导致再次使用这块内存时会得到未定义的结果 int i = *p;cout << i; //练习12.11的函数 void process(shared_ptr ptr) { //Do Something... }
//练习12.12auto p = new int();auto sp = make_shared ();process(sp); //正确//process(new int()); //错误,传入的是一个局部临时int*内置指针//process(p); //错误,传入的是一个int*内置指针process(shared_ptr (p)); //正确,将int*指针强制类型转换为智能指针 //并传入一个临时局部的智能指针 //函数调用返回时这个局部指针会被销毁 //计数变为0 //其指向的空间也将会被自动释放
//练习12.13auto sp = make_shared (42);auto p = sp.get();delete p; //没有释放其所指向的内存 //因为仍有智能指针sp指向这块内存 //计数为1cout << sp.use_count() << endl; cout << *sp << " " << *p;
切忌混用智能指针和内置指针,特别是用内置指针初始化智能指针,即
int *p = new int(42);shared_ptr sp(p);