c++中的智能指针auto_ptr

auto_ptr有一个特性就是转移控制权是一个比较有意思的功能;智能指针在在进行拷贝操作或者赋值操作(=)的时候,都会把所包含的指针的控制权转移到新的变量上去,而变量会指向一个空指针;

 

 

#include <memory> #include <string> #include <iostream> #include <utility> void getNOreturnPtr(auto_ptr<string> p){ cout << *p << " prt value" << endl; } int main(int args,char *argc[]){ string str="corey string"; auto_ptr<string> str_ptr(&str); getNOreturnPtr(str_ptr); cout << str << "prt value 2" << endl; }

这次的结果是str第二次打印的时候失败,因为str_ptr被传递给形参p,然后形参p获得了改智能指针的拥有权,而str_ptr失去了拥有权。

但是p没有在函数中北传出,在函数调用结束的时候,生命周期结束,所以str被delete;于是第二次打印str的时候,失败;

 

 

#include <memory> #include <string> #include <iostream> #include <utility> auto_ptr<string>getNOreturnPtr(auto_ptr<string> p){ cout << *p << " prt value" << endl; return p; } int main(int args,char *argc[]){ string str="corey string"; auto_ptr<string> str_ptr(&str); auto_ptr<string> str_ptr2=getNOreturnPtr(str_ptr); cout << str << "prt value 2" << endl; }

与实例1相反,p在函数调用的时候结束,传递给一个temp智能指针返回,temp在

      auto_ptr<string> str_ptr2=getNOreturnPtr(str_ptr);

这句话结束的时候会被销毁,但是他同时把智能指针的拥有权转至给str_ptr2,因此,在打印第二次str变量的时候,str并没有被销毁,因此成功;

 

void getNOreturnPtr(auto_ptr<string>& p){ cout << *p << " prt value" << endl; } int main(int args,char *argc[]){ string str="corey string"; auto_ptr<string> str_ptr(&str); getNOreturnPtr(str_ptr); cout << str << "prt value 2" << endl; }

 

实例3str第二次打印的时候仍然成功的原因在于因为形参是进行的引用传值,因此auto_ptr在整个函数过程中并没有任何拥有权转让操作,因此str在第二次打印的时候并没有被销毁,故打印成功;

你可能感兴趣的:(C++,String,delete)