ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 手动实现简单的智能指针类

2020-02-20 15:06:44  阅读:206  来源: 互联网

标签:count return SmartPointer 手动 C++ template ptr 指针


何为智能指针,即不需要用户再自动手动New和Delete掉,由内部类进行new和delete,这样可以防止用户忘记释放掉指针而造成的内存泄漏。
这里简单的实现unique_ptr智能指针的方式。
头文件
// 自制智能指针类头文件
template
class SmartPointer{
public:
SmartPointer(T* ptr_);
~SmartPointer();
T* operator->() const; //重载->符号
T& operator*() const; //重载符号
SmartPointer& operator=(SmartPointer&ptr_); //重写=符号::转移所有权
void Release(); //释放智能指针
T
GetObjPtr(); //得到指针地址
T * m_ptr; //存放智能指针
private:
int m_count;//指针计数:为0时可释放
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
实现文件
template
SmartPointer::SmartPointer(T* ptr_)
{
// 判断是否为空
if (ptr_)
{
m_ptr = ptr_;
m_count = 1;
}
else{
m_ptr = nullptr;
cout << “指针为空,无法实现智能指针” << endl;
m_count = 0;
}
}

template
SmartPointer::~SmartPointer()
{
if (m_ptr&&(m_count <= 1))
{
cout << “---------析构-------” << endl;
delete m_ptr;
m_ptr = NULL; //置为空
}
else
{
cout << “智能指针被转移:不进行析构” << endl;
}
}

template
T* SmartPointer::operator->() const
{
if (m_ptr)
{
return m_ptr;
}
else
{
cout << “智能指针为空,出错了!” << endl;
return nullptr;
}
}

template
T& SmartPointer::operator*()const
{
if (m_ptr)
{
return *m_ptr;
}
else{
cout << “智能指针为空,出错了!” << endl;
return NULL;
}
}

template
SmartPointer& SmartPointer::operator=(SmartPointer& ob_)
{
if (this != &ob_)
{
delete m_ptr;
m_ptr = ob_.m_ptr;
ob_.m_ptr = NULL;
}
return *this;
}

template
void SmartPointer::Release()
{
if(m_ptr)
{
delete m_ptr; //提前释放
m_ptr = NULL; //需要置为空
m_count = 0;
}
}

//得到指针对象
template
T* SmartPointer::GetObjPtr()
{
if (m_ptr)
{
m_count ++; //计数增加
return m_ptr;
}
return nullptr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
*使用方法如下:

//测试智能指针方法
void TestSmartPointer()
{
SmartPointer MM(new A());
SmartPointer
FF(new A());
}

int _tmain(int argc, _TCHAR* argv[])
{
TestSmartPointer();
system(“pause”);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
运行结果:

其中注意点:
1.类模板的声明与实现要在同一个文件中(原因是因为:c++标准中规定的模板类的在不用到它的时候不会被具现出来,编译后的链接时会出现问题。)解答源自:https://blog.csdn.net/qq_37623612/article/details/79473627

假如调用GetObjPtr()需要手动释放掉,这种的原因在于,用于特殊情况,需要自己手动删掉指针,为这种情况下提供接口(一般不建议使用)
————————————————
版权声明:本文为CSDN博主「Giser_D」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Giser_D/article/details/104376901

snow54678 发布了8 篇原创文章 · 获赞 0 · 访问量 162 私信 关注

标签:count,return,SmartPointer,手动,C++,template,ptr,指针
来源: https://blog.csdn.net/snow54678/article/details/104410605

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有