以对象管理资源01
先看如下代码段:
class Investment{•••}; //投资继承体系中的root class
//程序库利用工厂函数供应给我们特定的Investment对象:
//这里返回的指针指向Investment继承体系内的动态分配对象,调用者有责任最后删除它
Investment* createInvestment();
void f()
{
Investment* pInv = createInvestment();
// •••
delete pInv;
}
1.如果在…中有一个return
2.在…中抛出了一个异常
3.或者delete动作位于某个循环中,被continue,或者goto
就会泄漏pInv指向的那块资源。
为确保creatInvestment()返回的资源总是被释放掉,我们需要将资源放入对象内,当控制流离开f,该对象的析构函数会自动释放那些资源。
自己可以模拟代码如下:
#include<iostream>
#include<string>
using namespace std;
class jacktool{
public:
jacktool()
{
cout << "我创建了tool\n";
}
~jacktool()
{
cout << "我要消失了tool\n";
}
void show()
{
cout << "我就测试一下\n";
}
};
class ManageOBj
{
public:
ManageOBj(jacktool *m_tool)
{
m_mytool = m_tool;
}
~ManageOBj()
{
if (m_mytool)
{
delete m_mytool;
m_mytool = NULL;
}
}
jacktool *getTool()
{
return m_mytool;
}
private:
jacktool *m_mytool{ NULL };
};
static void play()
{
ManageOBj m_manage(new jacktool());
//在此可以使用m_manage对象,
m_manage.getTool()->show();
}
void main()
{
play();
system("pause");
}
结果:
如上代码当ManageOBj结束后自动执行其析构函数,析构函数然后delete jacktool类型的。
如果每使用一个工具就需要建立一个管理对象,这显然不合理,幸运的是编译器帮我们已经提供好了,这就是传说中的智能指针。详情请看下节。