- auto_ptr (c++98
- unique_ptr (c++11
- shared_ptr (c++11
可以将new获取的地址赋给这种对象,当智能指针过期时,其析构函数将使用delete来释放内存。- 头文件:memory
shared_ptr
含有跟踪引用特定对象的智能指针数,就是可以计数有多少个ptr指向同一个地址,当最后一个指向这个地址的ptr过期,才delete这个地址。
unique_ptr
ownership,只能有一个智能指针可以拥有特定对象。
auto_ptr也是这样,但是auto_ptr没那么严格。
auto_ptr与shared_ptr
#include<iostream>
#include<string>
#include<memory>
int main()
{
using namespace std;
auto_ptr<string> films[5]=
{
auto_ptr<string>(new string("Fowl Balls")),
auto_ptr<string>(new string("Duck Walks")),
auto_ptr<string>(new string("Chicken Runs")),
auto_ptr<string>(new string("Turkey Errors")),
auto_ptr<string>(new string("Goose Eggs"))
};
auto_ptr<string> pwin;
pwin = films[2];
cout<<"Films list:\n";
for(int i=0;i<5;i++)
cout<<*films[i]<<endl;
cout<<"Winner is "<<*pwin<<endl;
return 0;
}
pwin = films[2]
之后,films[2] 的所有权被pwin夺走,就是pwin指向那个地址,而films[2]变成空白字符串了
将auto_ptr换成shared_ptr
using namespace std;
shared_ptr<string> films[5]=
{
shared_ptr<string>(new string("Fowl Balls")),
shared_ptr<string>(new string("Duck Walks")),
shared_ptr<string>(new string("Chicken Runs")),
shared_ptr<string>(new string("Turkey Errors")),
shared_ptr<string>(new string("Goose Eggs"))
};
shared_ptr<string> pwin;
pwin = films[2];
cout<<"Films list:\n";
for(int i=0;i<5;i++)
cout<<*films[i]<<endl;
cout<<"Winner is "<<*pwin<<endl;
return 0;
unique_ptr和auto_ptr
从上面例子可知,使用auto_ptr极可能会导致指针所指地址的所有权被转到其他指针身上。unique_ptr发生这样的情况会报错。
且unique_ptr还有一个特点就是滞后性?
这样会报错。
using namespace std;
unique_ptr<string> s1(new string ("Hello I am"));
unique_ptr<string> s2;
s2 = unique_ptr<string> (new string(" Jeff"));
unique_ptr<string> s3(new string(*s2));
cout<<*s1<<*s2<<endl;
cout<<*s3<<endl;
return 0;
这样为什么不报错呢,因为它创建临时的unique_ptr对象,然后复制给s2,临时对象被删除,所以没啥问题。
using namespace std;
unique_ptr<string> demo(const char* c);
int main()
{
unique_ptr<string> s1,s2;
s1 = demo("I love you");
s2 = move(s1);
s1 = demo("Honey ");
cout<<*s1<<*s2<<endl;
return 0;
}
unique_ptr<string> demo(const char* c)
{
unique_ptr<string> s(new string(c));
return s;
}
move()函数可以将一个unique_ptr赋值给另一个,demo()函数的原理跟上面原理相同但是会更美化一些。