[c++基础] 智能指针

来源:互联网 发布:智能推送 算法 编辑:程序博客网 时间:2024/05/09 00:14

设计原理:将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。

auto_ptr

 

则C++会把m_example所指向的内存回收,使m_example1 的值为NULL,所以在C++中,应绝对避免把auto_ptr放到容器中。即应避免下列代码:

vector<auto_ptr<MyClass>>m_example;

当对容器操作的时候,赋值传递会使容器中多个元素被置为NULL,而这不是我们想看到的。


unique_ptr

避免了指针指向有效数据的问题,会出现编译错误提示,即:

unique_ptr<string> pu1(newstring ("hello world"));

unique_ptr<string> pu2;

pu2 = pu1;      // not allowed

unique_ptr<string>pu3;

pu3= unique_ptr<string>(new string("Yo!"));  //allowed

 

将一个unique_ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器允许这样做;如果源unique_ptr将存在一段时间,编译器将禁止这样做

还可以用std::move()将一个unique_ptr赋给另一个

unique_ptr<string> ps1, ps2;
ps1 = demo("hello");
ps2 = move(ps1);
ps1 = demo("alexia");
cout << *ps2 << *ps1 << endl;
另外, 可将unique_ptr存储到STL容器,只要不调用将一个unique_ptr复制或赋给另一个的相关算法(如sort()


shared_ptr

Shared_ptrauto_ptr最大的区别就是,shared_ptr解决了指针间共享对象所有权的问题,也就是auto_ptr中的赋值的奇怪问题。所以满足了容器的要求,可以用于容器中。

 


传送门

0 0