智能指针原理理解 和 ->运算符的重载
2019-03-14 23:32
120 查看
一个内存泄漏的实例:
[code]#include<iostream> void Func(int *p) { int *ptmp = new int; if (p == NULL) { throw std::exception("p is null!"); } *ptmp = *p; delete ptmp; } int main() { while (true) { try{ Func(NULL); } catch (std::exception& error) { std::cout << error.what() << std::endl; } } return 0; }
我们给Func函数的实参传入了一个NULL,当进入到Func函数内的 if 判断时,抛出异常,返回函数的调用点,但是Func函数没有释放 ptmp 所指向的内存,导致了内存泄露,这种问题一般是很难处理的,因此有了智能指针来帮助我们解决这个问题。
对智能指针的分析:
代码如下:
[code]#include<iostream> class SmartPtr { public: SmartPtr(int *p) :ptr(p){} SmartPtr() { delete ptr; ptr = NULL; } private: int *ptr; }; int main() { int *p = new int; delete p; SmartPtr sp = new int; //相比上一行,不用手动释放,由对象sp的析构函数来完成释放这个操作 return 0; }
->运算符的重载(->是单目运算符):
->运算符三步:
<1> sp.operator->() //对象先调用 operator->() 函数
<2> Test* ptmp //由第一步得到
<3> ptmp->Show() //通过指针来调用函数
[code]#include<iostream> using namespace std; class Test { public: Test(int val) :data(val){} void Show() { std::cout << data << std::endl; } private: int data; }; class SmartPtr { public: SmartPtr(Test *p) { ptr = p; } ~SmartPtr() { delete ptr; } Test& operator*() { return *ptr; } Test* operator->() { return ptr; } private: Test *ptr; }; int main() { Test *p = new Test(10); p->Show(); //通过指针就可以释放空间 delete p; SmartPtr sp = new Test(20); sp->Show(); //重载运算符->后, 则变为ptmp->Show(),ptmp为Test* 类型 return 0; }
相关文章推荐
- 深入理解运算符的重载
- 重载输入输出运算符引用的理解
- C++学习总结(十四)——类的运算符的重载原理,以及重载的实例
- C++ 自增运算符的重载以及理解
- C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)理解。
- <<C++ Primer>>中文版 重载箭头运算符的理解
- 运算符的重载
- 理解.NET中的CLR原理(一)
- 对Flush原理的个人理解
- 第九周试验任务1--定义Time类中的<<和>>运算符的重载,实现输入和输出。
- 剖析C++标准库智能指针(std::auto_ptr) 以及智能指针的原理
- /项目3-分数类中的运算符重载
- 深入理解include预编译原理
- 【原理】Histograms of Oriented Gradients (HOG)理解
- 斯坦福和NLTK英语短语词组抽取工具原理及源码理解
- C++复数类对除法运算符 / 的重载
- Spring MVC应用原理,读完本文,你理解了吗?
- shiro 权限认证的原理,个人的理解
- 第八周实验报告(二)实现Time类中的运算符重载,并对运算符的重载进行测试
- JAVA基础之理解JNI原理(有需要, 所以学习一下)