现在的位置: 首页 > 综合 > 正文

C++智能指针auto_ptr

2018年06月08日 ⁄ 综合 ⁄ 共 1297字 ⁄ 字号 评论关闭
 

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);

语句1ptr1拥有了classA的拥有权,第二个语句中,拥有权由ptr1转交给ptr2,从此ptr2classA的唯一拥有者,而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[]来释放其拥有的对象

 

 

抱歉!评论已关闭.