1 auto_ptr
该智能指针已经被弃用,下面只是演示它所有权改变后不报错误的代码,实际上你编译的时候它也会提示你auto已经被弃用,但还能运行。
#include <iostream>
#include <string>
#include <memory>
using namespace std;
/*
auto_ptr<>的使用 已经被C++11抛弃
1 采用所有权模式 存在潜在的内存问题 任何情况别用
这里只是演示它存在的问题
*/
void test01(){
auto_ptr<string> p1(new string("Hello World")); //开辟string对象并且用string的构造赋值 然后用智能指针p1指向
auto_ptr<string> p2;
p2=p1; //将p1所有权给p2 p1被释放了 不能再使用
for(int i=0;i<p2->size();i++){
//cout<<p1->at(i); error
cout<<p2->at(i);
}
cout<<endl;
}
/*
总结:p2=p1后,p2夺走所有权,你看源码可以知道p1会在交换之后被释放掉了,
所以在使用它就会相当于非法访问,但是他不会报错,这就是auto_ptr的问题。
*/
int main(){
test01();
return 0;
}
结果:
-
1)p1所有权被代替后,仍使用p1就会报错。
-
2)虽然更替后p2仍能使用,但存在的p1存在风险,开发人员可能不小心使用,所以绝对不能再使用auto_ptr。