#include<iostream>
#include<vector>
using namespace std;
void foo_realse()
{
int* Neew = new int(3);
{
std::auto_ptr<int> ptr(Neew);
int* p = ptr.release();//释放指针的所有权,但是对应的指针不释放
//单纯的解除了ptr和NEEW的关系。
}
}
void foo_reset()
{
int* Neew = new int(3);
int* p = new int(5);
{
//重新指向,原来指向的是Neew,让其指向P,并且直接释放之前的Neew,先释放再分配
std::auto_ptr<int>ptr(Neew);
ptr.reset(p);
}
}
void foo_test(std::auto_ptr<int> p)
{
printf("%d\r\n", *p);
}
//void foo_ary()
//{
// //存在一系列问题,反正不能将p直接放到vector中
// std::vector<std::auto_ptr<int>> Ary;
// std::auto_ptr<int> p(new int(3));
// Ary.push_back(p);
// printf("%d\r\n", *p);
//}
int main00()
{
std::auto_ptr<int>p1 = std::auto_ptr<int>(new int(3));
foo_test(p1);//值拷贝,相当于p=p1
//这里调用就会出错,因为拷贝构造函数的存在,p1实际上已经释放了其内部指针的所有权了。
//auto两大坑爹
//1.出作用域,都要释放这个指针,同一块内存被重复释放两次就会出错。
int* p = new int(3);
{
std::auto_ptr<int>ptr(p);
std::auto_ptr<int>ptr2(p);
}
//2.赋值的时候,所有权会发生转移。ptr就不能再进行相关的操作。
{
std::auto_ptr<int>ptr(new int(3));
std::auto_ptr<int>ptr2(new int(11));//赋值的时候,所有权会发生转移。
ptr2 = ptr;//ptr2的内容被释放,ptr1的内容被转移。
/*printf("%d", *ptr);*/
printf("%d", *ptr2);
}
return 0;
}