其原理:
通过对所管理的内存资源进行引用计数来达到对这个资源的管理;当新增一个shared_ptr对该资源进行管理时,或者说新增一个指向此资源的shared_ptr时,就将该资源的引用计数加1,反之,减少一个则减1。如果该资源的引用计数为0,则说明没有任何指针对其进行管理,就自动调用delete释放其所占用的内存资源。
当然并不是所有情况都要用到智能指针,一般在这几种情况下,优先考虑:
1、有多个使用者共同使用同一对象,而没有一个明显的拥有者;
2、一个对象的复制操作很昂贵;
3、要把指针存入标准库容器;
4、要传送对象到库或从库获取对象,而这些对象又没有明确的所有权;
5、当管理需要特殊清除方式的资源时,可以通过定制shared_ptr的删除器来实现;
以下为第一种情况下使用shared_ptr
代码如下:
// 1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class Employee
{
public:
Employee( string strName )
: m_strName( strName )
{
}
string GetName()
{
return m_strName;
}
private:
string m_strName;
};
class PrintEng
{
public:
PrintEng( shared_ptr<Employee> sp )
: m_spEmp( sp )
{
}
void doPrint()
{
if ( true == (bool)m_spEmp )
{
cout<<"name of employee : "<<m_spEmp->GetName()<<endl;
}
}
private:
shared_ptr<Employee> m_spEmp;
};
class PrintChs
{
public:
PrintChs( shared_ptr<Employee> sp )
: m_spEmp( sp )
{
}
void doPrint()
{
if ( true == (bool)m_spEmp )
{
cout<<"员工的姓名为 : "<<m_spEmp->GetName()<<endl;
}
}
private:
shared_ptr<Employee> m_spEmp;
};
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<Employee> spEmp( new Employee("zhouzhou") );
PrintEng pEng(spEmp);
pEng.doPrint();
PrintChs pChs(spEmp);
pChs.doPrint();
system("pause");
return 0;
}
以下是以vector为容器
// 1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;
class Employee
{
public:
Employee( string strName )
: m_strName(strName)
{
}
string GetName()
{
return m_strName;
}
private:
string m_strName;
};
class PrintEng
{
public:
PrintEng(shared_ptr<Employee> sp)
: m_spEmp(sp)
{
}
void doPrint()
{
if( true == (bool)m_spEmp )
{
cout<<"name of Employee: "<<m_spEmp->GetName()<<endl;
}
}
private:
shared_ptr<Employee> m_spEmp;
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef vector< shared_ptr<Employee> > container;
shared_ptr<Employee> spEmp(new Employee("zhouzhou"));
container vecEmp;
vecEmp.push_back( spEmp );
vecEmp.push_back( shared_ptr<Employee>( new Employee("haha")));
for (auto it = vecEmp.begin(); it != vecEmp.end(); ++it)
{
PrintEng pEng( *it );
pEng.doPrint();
}
return 0;
}