您的位置:首页 > 编程语言 > C语言/C++

c++中的智能指针auto_ptr

2010-04-20 23:39 441 查看
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在第二次打印的时候并没有被销毁,故打印成功;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: