auto_ptr的使用
2016-05-11 11:58
405 查看
auto_ptr是许许多多智能指针中的一种,auto_ptr做这样一件事:拥有一个动态分配内存对象,并且在它不再需要的时候履行自动清理的职责。
下面上一些使用例子:
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
printf("auto_d: %d\n", auto_d->d);
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
输出结果:
auto_d: 1
D destruction
观察输出结果我们发现,auto_d在离开作用域的时候把动态分配的对象析构掉了
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
printf("auto_d: %d\n", auto_d->d);
D* p = auto_d.release();
if (p)
{
printf("p->d: %d\n", p->d);
}
delete p;
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}输出结果:
auto_d: 1
p->d: 1
D destruction
这个例子中,我们使用了release把动态分配的指针从auto_d中提取出来裸露使用,此时auto_d已经失去动态分配指针的所有权了,所以最后我们要自行删掉动态分配指针,不然会造成内存泄露
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
printf("auto_d: %d\n", auto_d->d);
auto_d.reset(new D());
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
运行结果:
auto_d: 1
D destruction
D destruction
使用reset会把auto_d原来关联的指针删除,然后再绑定新的指针到auto_d上去
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
D* p = auto_d.get();
printf("p->d: %d\n", p->d);
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
运行结果:
p->d: 1
D destruction
auto_ptr的get成员函数可以返回绑定的指针,但并不会解绑
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
auto_ptr<D> RetAP()
{
auto_ptr<D> auto_d(new D());
return auto_d;
}
void AutoUse()
{
auto_ptr<D> auto_d = RetAP();
printf("auto_d->d: %d\n", auto_d->d);
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
运行结果:
auto_d->d: 1
D destruction
函数返回auto_ptr对象
推荐一篇十分详细的文章: http://www.cppblog.com/mymsdn/archive/2010/04/07/Using-auto_ptr-Effectively.html
下面上一些使用例子:
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
printf("auto_d: %d\n", auto_d->d);
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
输出结果:
auto_d: 1
D destruction
观察输出结果我们发现,auto_d在离开作用域的时候把动态分配的对象析构掉了
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
printf("auto_d: %d\n", auto_d->d);
D* p = auto_d.release();
if (p)
{
printf("p->d: %d\n", p->d);
}
delete p;
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}输出结果:
auto_d: 1
p->d: 1
D destruction
这个例子中,我们使用了release把动态分配的指针从auto_d中提取出来裸露使用,此时auto_d已经失去动态分配指针的所有权了,所以最后我们要自行删掉动态分配指针,不然会造成内存泄露
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
printf("auto_d: %d\n", auto_d->d);
auto_d.reset(new D());
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
运行结果:
auto_d: 1
D destruction
D destruction
使用reset会把auto_d原来关联的指针删除,然后再绑定新的指针到auto_d上去
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class D
{
public:
D() : d(1) {}
~D() { printf("D destruction\n"); }
int d;
};
void AutoUse()
{
auto_ptr<D> auto_d(new D());
D* p = auto_d.get();
printf("p->d: %d\n", p->d);
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
运行结果:
p->d: 1
D destruction
auto_ptr的get成员函数可以返回绑定的指针,但并不会解绑
#include <stdio.h>
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
auto_ptr<D> RetAP()
{
auto_ptr<D> auto_d(new D());
return auto_d;
}
void AutoUse()
{
auto_ptr<D> auto_d = RetAP();
printf("auto_d->d: %d\n", auto_d->d);
}
int _tmain(int argc, _TCHAR* argv[])
{
AutoUse();
getchar();
return 0;
}
运行结果:
auto_d->d: 1
D destruction
函数返回auto_ptr对象
推荐一篇十分详细的文章: http://www.cppblog.com/mymsdn/archive/2010/04/07/Using-auto_ptr-Effectively.html
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- python 多行匹配
- sql 优化
- 交叉验证(简单交叉验证、k折交叉验证、留一法)
- Linux常用命令
- Spring中的ThreadPoolTaskExecutor
- android 调用系统各种应用
- Python网络编程08----Django模版
- iOS基础:深入理解Objective-c中@class的含义
- HDU1241 DFS/BFS 求连通块
- iOS基础:深入理解Objective-c中@class的含义
- 二叉树和链表复习
- git 本地提交后如果让服务器上的GIT 自动更新拉取
- HTTP 幂等性
- platform-tools\adb.exe,start-server' failed -- run manually if necessary,adb启动失败,端口被占用
- android加载GIF动画
- mac 包管理器安装mysql
- android面试笔试常见面试题
- centos6下安装dedecms
- ubuntu gitweb配置