admin管理员组文章数量:1666726
在C、C++中,内存泄漏引起的Bug数不胜数,主要就是申请动态内存后用完不释放,而C++又不像java那样拥有内存回收机制,在C++中,指针是无法控制所指堆空间生命周期的,所以非常容易造成堆空间申请未释放,导致内存泄漏,甚至软件奔溃。
为了解决这个问题,C++中引入了智能指针的概念
-智能指针是一种特殊的指针
-智能指针的生命周期结束时主动释放堆空间
-一片堆空间最多只能由yi个指针标识,防止重复释放
-杜绝指针运算跟比较
C++中,我们通过类成员函数重载指针特征操作符( -> 和 *),并且不能使用参数,下边来看下代码:
#include <iostream>
#include <string>
using namespace std;
class Test
{
private:
int m_value;
public:
Test(){}
Test(int i)
{
m_value = i;
}
int getValue()
{
return m_value;
}
~Test()
{
}
};
class SmartPointer
{
private:
Test *m_pTest; //目前创建的SmartPointer智能指针只能指向Test类对象
public:
SmartPointer(Test *p = NULL)
{
cout << "SmartPointer(Test *p = NULL)" << endl;
m_pTest = p;
}
SmartPointer(const SmartPointer& obj) //重写拷贝构造函数
{
cout << "SmartPointer(const SmartPointer& obj)" << endl;
m_pTest = obj.m_pTest;
const_cast<SmartPointer&>(obj).m_pTest = NULL;
}
SmartPointer& operator =(const SmartPointer& obj) //赋值构造函数
{
if (this != &obj)
{
delete m_pTest;
m_pTest = obj.m_pTest;
const_cast<SmartPointer&>(obj).m_pTest = NULL;
}
return *this;
}
bool isNULL()
{
return (NULL == m_pTest);
}
Test* operator ->() //重载指针操作符
{
return m_pTest;
}
Test& operator *() //重载指针操作符
{
return *m_pTest;
}
~SmartPointer()
{
cout << "~SmartPointer()" << endl;
if (!isNULL())
{
delete m_pTest;
}
}
};
int main()
{
{
SmartPointer p1 = new Test(12);
SmartPointer p2 = p1;
cout << "p1.isNULL() = " << p1.isNULL() << endl;
cout << "p2->getValue() = " << p2->getValue() << endl;
}
system("pause");
}
编译运行:
从输出结果看,当智能指针的生命周期结束后,会自动调用析构函数,做对应的内存释放,这样就避免了内存泄漏。但是上边我们所写的智能指针,只能指向Test类对象,在后续的模板及泛型编程,我们会解决这个问题,使得智能指针能指向任意的变量及对象。
注意:智能指针只能指向堆空间的对象或变量!
总结:
- 指针特征操作符( -> 和 *)可以被重载
- 重载指针特征符能够使用对象代替指针
- 智能指针只能用于指向堆空间中的内存
- 智能指针的意义在于最大程度的避免内存泄漏问题
版权声明:本文标题:C++中智能指针 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1730076000a1221784.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论