1.智能指针ps有一个析构函数, 该析构函数将在ps过期时释放它指向的内存。
2.使用智能指针需要包含的库#include
3.智能指针使用泛型,所以应该用泛型定义方式。
//创建智能指针时必须提供额外的信息,指针可以指向的类型:
shared_ptr<string> p;
shared_ptr<vector<int>> a;
/*最安全的分配和使用动态内存的方法就是调用一个名为make_shared的标准库函数,
此函数在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr
*/
shared_ptr<int> p3 = make_shared<int>(42);
shared_ptr<string> p4 = make_shared<string>(5, '9');
shared_ptr<int> p5 = make_shared<int>();//不传递任何参数,则被默认初始化
cout <<"p4="<< *p4 << endl;
cout << "p5=" << *p5 << endl;
//三种指针均可用如下方式定义
auto_ptr<string> ps(new string);
unique_ptr<int> pdu(new int);
shared_ptr<string> pss(new string);
*ps = "abc";
cout << *ps << endl;
auto_ptr采用所有权概念,对于特定的对象只有一个指针能够拥有它,而赋值语句可以转让所有权,只有当拥有对象的智能指针的析构函数会删除该对象
auto_ptr<string> films[5] = {
auto_ptr<string>(new string("dad")),
auto_ptr<string>(new string("man")),
auto_ptr<string>(new string("man")),
auto_ptr<string>(new string("man")),
auto_ptr<string>(new string("man")),
};
auto_ptr<string> pwin;
pwin = films[2];//所有权转让
//当所有权转让后,films[2]就不再引用该字符,films[2]变为了应该空指针所以以下输出会出错
/*for (int i = 0; i < 5; ++i)
cout << *films[i] << endl;*/
auto_ptr<string> p1(new string("auto"));
auto_ptr<string>p2;
p2 = p1;//auto_ptr所有权转让后,p1失去对string对象的引用,但不会保报错
unique_ptr和auto_ptr 一样采用所有权的概念,但它比auto_ptr 更安全
unique_ptr<string> pp3(new string("unique"));
unique_ptr<string> pp4;
//p4 = p3;//使用unique_ptr时,所有权转让在编译期间发生报错,所以unique_ptr更安全
unique_ptr不允许非临时值转让所有权,但允许临时右值转让所有权,利用这一点,可以将unique_ptr作为函数返回值(因为返回值常常是一个临时变量)
//定义函数,
//unique_ptr的重要使用场景,将其作为函数返回值
unique_ptr<string> fun(const char* s) {
unique_ptr<string> temp(new string(s));
return temp;
}
unique_ptr<int> make_int(int n) {
return unique_ptr<int>(new int(n));
}
//在其他函数中可以通过如下方式使用
unique_ptr<string> s = fun("abc");
cout << *s << endl;
unique_ptr<string> pp5;
pp5 = unique_ptr<string>(new string("yyaya"));
cout << *pp5 << endl;
shared_ptr采用高智能的指针,跟踪引用特定对象的智能指针数(引用计数),赋值时,计数将加1,而指针过期时,计数将减1。仅当最后一个指针过期时,才调用delete
shared_ptr<string> films2[5] = {
shared_ptr<string>(new string("dad")),
shared_ptr<string>(new string("man")),
shared_ptr<string>(new string("man")),
shared_ptr<string>(new string("man")),
shared_ptr<string>(new string("man")),
};
shared_ptr<string> pwin2;
pwin2 = films2[2];
//使用shared_ptr指针将不会有任何问题pwin2 和films2[2]这两个智能指针同时指向同一个内存
for (int i = 0; i < 5; ++i)
cout << *films2[i] << endl;
cout << "pwin2指向的类容为:" << *pwin2 << endl;