再谈智能指针

http://www.cnblogs.com/lewiskyo/p/4214592.html  之前写过一篇文章介绍智能指针,并且简单实现了auto_ptr.

里面提到 auto_ptr 不能做为Stl容器的元素,原因具体是 http://www.360doc.com/content/14/0429/16/1317564_373230218.shtml

简要来说就是在对Stl容器元素进行复制构造时,不能改变原来的值(const T2& value),而auto_ptr在复制构造的时候,一定会修改元素的值(即将指向实际内存地址的指针置NULL),

否则就会两个指针指向同一个地址,当析构的时候就会出现重复析构。

而在引入shared_ptr后,这个问题就解决了,因为shared_ptr有引用数量。

这里想简单实现下 shared_ptr, 代码基于 http://www.cnblogs.com/yangshaoning/archive/2012/03/18/cpp_smart_pointer.html

这里加上了模板,代码如下:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4
 5
 6 template <typename T> class SmartPtr;
 7
 8 template<typename T>
 9 class RefPtr
10 {
11     friend class SmartPtr<T>;
12
13     RefPtr(T *pointer = NULL):t( pointer), count(1)
14     {
15     }
16
17     ~RefPtr()
18     {
19         cout << "destructor delete refptr" <<endl;
20         delete t;
21     }
22
23     T *t;
24     int count;
25
26 };
27
28
29 template<typename T>
30 class SmartPtr
31 {
32     public:
33         SmartPtr( T* object): rp(new RefPtr<T>(object))
34         {
35         }
36
37         SmartPtr(const SmartPtr& rhs):rp(rhs.rp)
38         {
39             ++rp->count;
40         }
41
42         SmartPtr& operator=(const SmartPtr &rhs)
43         {
44             if(this == &rhs)
45                 return *this;
46
47             --rp->count;
48             if (rp->count == 0)
49                 delete rp;
50
51             rp = rhs.rp;
52             ++rp->count;
53
54             return *this;
55         }
56
57         ~SmartPtr()
58         {
59             --rp->count;
60             if (rp->count == 0)
61                 delete rp;
62         }
63
64     private:
65         RefPtr<T> *rp;
66 };
67
68
69 int main()
70 {
71
72     {
73         SmartPtr<int> s1(new int(10));
74         SmartPtr<int> s2(s1);
75
76         SmartPtr<int> s3 (new int (20));
77         s3 = s1;
78     }
79
80     cout << "operator v1" << endl;
81
82     {
83         vector<SmartPtr<int> > v1;
84         v1.push_back(SmartPtr<int>(new int (10)));
85         v1.push_back(SmartPtr<int>(new int (10)));
86         v1.push_back(SmartPtr<int>(new int (10)));
87         v1.push_back(SmartPtr<int>(new int (10)));
88     }
89
90     cout << "operator v1 end" << endl;
91 }

几个注意点:

1. 第六行需要前置声明SmartPtr,否则RefPtr会识别不了这个友元.

2. RefPtr::count仅在SmartPtr内改变值。

3. SmartPtr::rp仅是一个指针,若然多个SmartPtr指向同一个对象,那么多个SmartPtr::rp则共享同一份地址,当SmartPtr析构时,--count,count==0时要 delete rp, 释放rp指向的地址,其他情况不必delete,只需要让系统回收rp指针所占用的地址即可。

时间: 2024-10-29 10:46:24

再谈智能指针的相关文章

浅谈智能指针的历史包袱

我们学习C++的时候,想必都会听说一个叫智能指针的东西,在初听这个词的时候,我们都难免不被“智能”两个字所吸引,感觉它会比较高级,让人有种忍不住想用一把的冲动. 但事实上,它可能并没有我们所想的那样“智能”.好用,它本质上其实就是一个对象,它去接管了原指针所管理的资源.但这里单单用一个对象就想有“智能”的效果并没有那么容易.在智能指针发展的过程中,出现了Autor_ptr等多种版本的智能指针,但它们都确都或多或少有一些问题存在(相信早期的前辈们会深有感触).但智能指针的使用性却是不可否认的.它在

第二十七课 再论智能指针(上)

思考: 使用智能指针替换单链表LinkLIst中的原生指针是否可行? 将LinkList.h中的Node指针全部改成智能指针: 1 #ifndef LINKLIST_H 2 #define LINKLIST_H 3 4 #include "List.h" 5 #include "Exception.h" 6 #include "SmartPointer.h" 7 8 namespace DTLib 9 { 10 11 template <

第28课 再论智能指针(下)

1. SharedPointer的设计 (1)使用类模板,通过计数机制标识堆内存 (2)堆内存被指向时,refCount++ (3)指针被置空时:refCount- (4)当refCount == 0时,释放堆内存 2. 计数机制原理剖析 3. SharedPointer类的声明 template <typename T> class SharedPointer : public Pointer<T> { protected: int m_refCount; //计数机制成员 pu

第二十八课 再论智能指针(下)

多个智能指针指向同一片堆空间的需求是巨大的. 计数变量也是在堆空间里面定义的,它的生命周期和对象的生命周期相同. 添加SharedPointer.h文件: 1 #ifndef SHAREDPOINTER_H 2 #define SHAREDPOINTER_H 3 4 #include <cstdlib> 5 #include "Pointer.h" 6 #include "Exception.h" 7 8 namespace DTLib 9 { 10 1

再论智能指针(上)

0.引言: 目的:使用智能指针替代LinkList中的原生的指针, 限制:但是我们的智能指针设定了只能单个指针指向某一片堆空间 1. 智能指针的继承层次结构 (1)Pointer是智能指针的抽象父类(模板) ①纯虚析构函数:virtual ~Pointer()=0; ②重载operator->() ③重载operator*() (2)类的声明 1 template <typename T> 2 class Pointer : public Object 3 { 4 protected:

Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6786239 Android 系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为 我们提供了智能指针,避免出现上述问题,本文将系统地分析Android系统智能指针(轻量级指针.强指针和弱指针)的实现原理. 在使用C++来编写代码的过程中,指针使用不当造成

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析,左值与右值

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析 by 小威威 1. 知识引入 在C++编程中,动态分配的内存在使用完毕之后一般都要delete(释放),否则就会造成内存泄漏,导致不必要的后果.虽然大多数初学者都会有这样的意识,但是有些却不以为意.我曾问我的同学关于动态内存的分配与释放,他的回答是:"只要保证new和delete成对出现就行了.如果在构造函数中new(动态分配内存),那么在析构函数中delete(释放)就可以避免内存泄漏了!" 事实果真如此么?

C语言第十二回合:再谈指针

C语言第十二回合:再谈指针 [学习目标] 1.        指针数组 2.        数组指针 3.        函数指针 ( 1 )指针数组 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身 决定.它是"储存指针的数组"的简称 如: 定义数组名为ptr,其中包含10个指向int类型的数据的指针 int *ptr[ 10];  //指针数组,int*修饰数组的内容 [程序] #include <stdio.h> void print_err