智能指针之 auto_ptr
C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理,该智能指针在C++11中已经被弃用,转而由unique_ptr替代,那这次使用和实现,就具体讲一下auto_ptr被弃用的原因,(编译平台:Linux centos 7.0 编译器:gcc 4.8.5 )
首先使用std::auto_ptr时,需要#include <memory>头文件,具体使用代码如下(文件名:test_ptr.cpp):
#include <memory>
#include <iostream> using namespace std; class Test
{
public:
Test()
{
cout << "construct.." << endl;
} ~Test()
{
cout << "destruct.." << endl;
}
}; void test()
{ } int main()
{
Test* p = new Test();
auto_ptr<Test> ap(p); return 0;
}
执行上述代码,我们可以看到,程序结束时,在堆上申请的对象,自动执行了析构函数,将内存释放了
[root@localhost code]# g++ -g -o autop test_ptr.cpp
[root@localhost code]# ./autop
construct..
destruct..
[root@localhost code]#
具体实现代码如下,构造函数只实现了初始化构造和拷贝构造:
#include <iostream> using namespace std; template<typename T>
class auto_pt
{
public:
explicit auto_pt(T* p = NULL):m_ptr(p)
{
p = NULL;
cout << "auto_ptr construct" << endl;
} auto_pt(auto_pt& autoPtr):m_ptr(autoPtr.m_ptr)
{
autoPtr.m_ptr = NULL;
cout << "copy auto_ptr construct" << endl;
} auto_pt& operator = (auto_pt& p)
{
if(this != &p)
{
if(m_ptr != NULL)
{
delete m_ptr;
m_ptr = p.m_ptr;
p.m_ptr = NULL;
}
} return *this;
} ~auto_pt()
{
if(m_ptr != NULL)
{
cout << "auto_ptr destruct" << endl;
delete m_ptr;
m_ptr = NULL;
} } T* Get()
{
return m_ptr;
} T& operator*()
{
return *m_ptr;
} T* operator->()
{
return m_ptr;
} private:
T* m_ptr;
}; class Test
{
public:
Test()
{
cout << "construct.." << endl;
} ~Test()
{
cout << "destruct.." << endl;
} void method()
{
cout << "welcome Test.." << endl;
}
}; void f(auto_pt<Test>ap)
{
cout << "funtion f :";
ap->method();
} int main()
{
//baseic test
Test* p = new Test();
cout << "address0 [%p]" << p << endl;
auto_pt<Test> ap(p); cout << "address1 [%p]" << ap.Get()<< endl;
cout << "address2 [%p]" << &ap << endl;
cout << "address3 [%p]" << &(*ap) << endl; ap.Get()->method();
(*ap).method();
ap->method(); return ;
}
打印结果:
[root@localhost code]# g++ -o autop_test test.cpp
[root@localhost code]# ./autop_test
construct..
address0 [%p]0xb77010
auto_ptr construct
address1 [%p]0xb77010
address2 [%p]0x7ffe8b25f510
address3 [%p]0xb77010
welcome Test..
welcome Test..
welcome Test..
auto_ptr destruct
destruct..
[root@localhost code]#
大概实现就是这样,基本和标准库差不多,除了另外两种类型的构造函数没有加进去
那在我们使用及实现的过程中,发现这个auto_ptr在使用过程中会有如下风险,因此在C++11中已经不再使用,那在我们开发过程中,也最好不要再使用
1. 两个auto_ptr指向同一块内存,造成多次释放
//if 2 object point one address, application will die
Test* p1 = new Test(); auto_pt<Test> ap1(p1);
auto_pt<Test> ap2(p1);
2. 复制完成后,会将复制的对象置空,因此不能继续使用
int*p=new int();
auto_pt<int>ap1(p);
auto_pt<int>ap2=ap1;
(*ap1).method();//错误,此时ap1只剩一个null指针在手了
3. 函数形参使用值传递,会发生拷贝操作,导致ap1对象权限获取不到了
void f(auto_pt<int>ap)
{
(*ap).method();
} auto_pt<int>ap1(new int());
f(ap1);
(*ap1).method();;//错误,经过f(ap1)函数调用,ap1已经不再拥有任何对象了。
智能指针之 auto_ptr的更多相关文章
- [3] 智能指针std::auto_ptr
[1]std::auto_ptr 对于编译器来说,智能指针实质是一个栈对象,而并非指针类型. 智能指针通过构造函数获取堆内存的管理所有权,而在其生命期结束时,再通过析构函数释放由它所管理的堆内存. 所 ...
- 【C++深入浅出】智能指针之auto_ptr学习
起: C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template& ...
- 智能指针之auto_ptr和scoped_ptr
部分参考地址https://blog.csdn.net/yanglingwell/article/details/56011576 auto_ptr是c++标准库里的智能指针,但是具有以下几个明显的缺 ...
- C++ 智能指针 std::auto_ptr 分析
背景介绍: RAll机制 定义一个类来封装资源的分配和释放,在构造函数中完成资源的分配和初始化,在析构函数中完成资源的清理,从而保证资源的正确初始化和清理 ps:智能指针就是RAll机制的一种应用,智 ...
- 智能指针shared_ptr, auto_ptr, scoped_ptr, weak_ptr总结
看这里: http://blog.csdn.net/lollipop_jin/article/details/8499530 shared_ptr可以多线程同时读,但是涉及到写,需要加锁. share ...
- auto_ptr,shared_ptr 智能指针的使用
Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...
- C++ 智能指针Auto_PTR 分析
C++的动态内存的分配与释放是个挺折磨人的事情,尤其异常分支复杂时(比如一堆try catch中,各catch里需要做delete 掉相关的堆上分配的内存),极有可能产生内存泄露的情况.C++中提供了 ...
- 32.智能指针auto_ptr
#include <iostream> #include <memory> #include <string> #include <vector> us ...
- C++智能指针简单剖析
导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...
随机推荐
- 201421123042 《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- Java代码风格和在idea中的一些设置
源文件基本设置 1. 文件名 驼峰标识,.java结尾 2. 编码 统一为UTF-8 Transport...可以解决property文件不能正常显示为中文的问题 3. 特殊字符 尽量使用转义字符(\ ...
- node框架express
见识到原生nodeJs服务器的恶心后,我们来用下简单好用的框架吧~ 服务器无非主要提供接口和静态文件读取,直接上代码: const express = require('express'); cons ...
- unity A*寻路 (三)A*算法
这里我就不解释A*算法 如果你还不知道A*算法 网上有很多简单易懂的例子 我发几个我看过的链接 http://www.cnblogs.com/lipan/archive/2010/07/01/1769 ...
- MQTT和paho(二)socket
参考链接:http://blog.csdn.net/yangzl2008/article/details/8861069
- apigw鉴权分析(1-3)百度 AI - 鉴权方式分析
http://ai.baidu.com/docs#/Begin/top 一.访问入口 二.鉴权方式分析 1.鉴权认证方式一 - access_token - 针对HTTP API调用者 2.鉴权认证方 ...
- python 开发之路 -MySQL
阅读目录 第一篇 : 数据库 之 基本概念 第二篇 : MySQL 之 库操作 第三篇 : MySQL 之 表操作 第四篇 : MySQL 之 数据操作 第五篇 : MySQL 之 视图.触发器.存储 ...
- python之集合,深浅copy
一. 集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- python Django知识点总结
python Django知识点总结 一.Django创建项目: CMD 终端:Django_admin startproject sitename(文件名) 其他常用命令: 其他常用命令: 通过类创 ...
- CWMP开源代码研究——cwmp移植
原创作品,转载请注明出处,严禁非法转载.如有错误,请留言! email:40879506@qq.com 声明:本系列涉及的开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅 ...