C++ auto_ptr
C++提供的auto_ptr是一种智能型指针,帮助程序员防止“被异常抛出时发生资源泄露”
这个指针要保证无论在何种情况下,只要自己被摧毁,就一定连带释放其所控制的空间
该指针要求对象只有一个拥有者,严禁一物二主
注意:
std::auto_ptr<ClassA>ptr1(new ClassA)是正确对智能指针的初始化
std::auto_ptr<Class A>ptr2= newClassA;错,因为只有智能指针可以给智能指针赋值
ptr2 = std::auto_ptr<Class A>(newclassA);
智能指针使用时要注意:
它存在一个拥有权转移的问题
因为智能指针不允许同一块区域归两个指针所共有
std::auto_ptr<calssA>ptr1(calssA);
std::auto_ptr<calssA> ptr2(ptr1);
语句1中ptr1拥有了classA的拥有权,第二个语句中,拥有权由ptr1转交给ptr2,从此ptr2是classA的唯一拥有者,而ptr1不再拥有这块区间,ClassA 区间只会被delete一次
注意:正是因为智能指针的这个特性会产生致命的错误
template <class T>
voidfn(std::auto_ptr<T> p)
{
if(p.get()== NULL)
cout <<”NULL”<<endl;
else
cout <<*p<<endl;
}
把智能指针传进函数里,就会将智能指针的使用权传给这个被调函数中,当函数退出时会自动删除这个指针对象,从而也删除了这一块空间;而main函数中再也不会拥有这个指针的使用权,但main函数中并没有这样想
int main(void)
{
std::auto_ptr<int> p(new int(2));
*p= 4;//change the data
fn(p);
*p =10;//Error
}
如上所示,*p = 10;就会导致错误
为了改变上述情况,使用const就可以避免轻易把指针使用权转交给别人或者采用计数型auto_ptr(指针里有一个count,用来标记该指针所指对象有几个拥有着,当且仅当该数为1时,指针delete时会释放对象空间)。
下面我们主要讨论常智能指针:
conststd::auto_ptr<int> constp(new int(2));
const std::auto_ptr<int>constq(new int(3));
*constp= *constq;//OK;
constp= constq;//Error,企图转移拥有权,失败
fn(constp);//Error
所以,常数型auto_ptr减小了“不经意转移拥有权”所带来的危险,只要一个对象通过auto——ptr传递,就可以通过常数型auto_ptr来终结拥有权转移。
在这里,const并不能阻止你修改指针所指对象的值,而是你不能修改auto_ptr的拥有权,如上面代码所示,常数型指针相当于常指针,T* const p;
注意,不存在指向数组的auto_ptr,因为auto_ptr是通过delete而非delete[]来释放其拥有的对象