接着下来,需要演示一下怎么样在多个对象里共享一个对象,而不管每个对象的生命周期,就可以及时地把使用的对象在合适地方删除。下面的例子里先定义两个类,然后每个类都引用共享的对象,接着使用完成后,就会在析构函数里删除,可以从例子程序运行的输出结果看到内部运行的生命周期。有了共享智能指针,面对多个对象共享使用一个对象,这样的管理会方便很多。具体代码如下:
//在两个对象之间共享使用shared_ptr
class CObjA
{
public:
CObjA(boost::shared_ptr< int > pA)
:m_pA(pA)
{
}
~CObjA()
{
std::cout << "m_pA.use_count() :" << m_pA.use_count() << std::endl;
}
void Print(void)
{
std::cout << "A Print = " << *m_pA << std::endl;
}
private:
boost::shared_ptr< int > m_pA;
};
class CObjB
{
public:
CObjB(boost::shared_ptr< int > pB)
:m_pB(pB)
{
}
~CObjB()
{
std::cout << "m_pB.use_count() :" << m_pB.use_count() << std::endl;
}
void Print(void)
{
*m_pB += 100;
std::cout << "B Print = " << *m_pB << std::endl;
}
private:
boost::shared_ptr< int > m_pB;
};
void TestObj(void)
{
//创建一个共享指针。
boost::shared_ptr< int > pObj(new int);
*pObj = 10;
//传给两个对象使用。
CObjA objA(pObj);
CObjB objB(pObj);
objA.Print();
objB.Print();
//
CObjA* pObjA = new CObjA(pObj);
pObjA->Print();
delete pObjA;
//赋值操作。
boost::shared_ptr< int > pLast = pObj;
std::cout << "pLast.use_count() :" << pLast.use_count() << std::endl;
//比较操作
if (pLast == pObj)
{
std::cout << "pLast == pObj" << std::endl;
}
}
例子运行的结果如下:
100
A Print = 10
B Print = 110
A Print = 110
m_pA.use_count() :4
pLast.use_count() :4
pLast == pObj
m_pB.use_count() :3
m_pA.use_count() :2
请按任意键继续. . .
从上面的例子看到,可以使用函数use_count()来查看引用计数,这样方便调试和做单元测试,以及自动化测试。不过,在使用智能指针shared_ptr时,需要注意下面几个问题:
1. 不要让智能指针构造循环引用的情况,否则引用计数的技术就会失效,导致内存对象不能删除。
2. 不要让智能指针构造没有名字的临时对象。
3. 如果有多个线程的情况下,需要加锁对智能指针进行赋值和删除。如果只是读取智能指针的对象,是没有任何问题。
本文探讨了如何使用智能指针在多个对象间共享资源,并在使用完毕后自动释放内存,通过实例展示了析构函数的作用及生命周期管理的重要性。强调了智能指针在避免循环引用和临时对象管理上的优势,同时提到了多线程环境下智能指针的正确使用方法。
1378

被折叠的 条评论
为什么被折叠?



