#include <iostream>
#include <tr1/memory>
#include <boost/scoped_ptr.hpp> //scoped_ptr还不属于tr1
#include <boost/scoped_array.hpp> //scored_array也不属于tr1
#include <boost/shared_array.hpp> //shared_array也不属于tr1
class CTest
{
public:
CTest() : m_id(0) {}
CTest(int id) : m_id(id) {}
~CTest()
{
std::cout << "id :" << m_id << "-Destuctor isbeing called\n";
}
void SetId(int id)
{
m_id = id;
}
int GetId()
{
return m_id;
}
void DoSomething()
{
std::cout << "id :" << m_id << "-DoSomething\n";
}
private:
int m_id;
};
int main(int argc, char* argv[])
{
// scoped_ptr
boost::scoped_ptr<CTest> pTest(new CTest);
pTest->SetId(123);
pTest->DoSomething();
// error scoped_ptr(scoped_ptr const &) is private;
// boost::scoped_ptr<CTest> pTest2(pTest);
// error scoped_ptr & operator=(scoped_ptr const &) is private;
// boost::scoped_ptr<CTest> pTest2;
// pTest2 = pTest;
// scoped_array
boost::scoped_array<CTest> pVecTest(new CTest[2]);
pVecTest[0].SetId(111);
pVecTest[0].DoSomething();
// shared_ptr
std::tr1::shared_ptr<CTest> pSt(new CTest);
pSt->SetId(999);
pSt->DoSomething();
std::tr1::shared_ptr<CTest> pSt2(pSt); // ok
pSt2->DoSomething();
std::tr1::shared_ptr<CTest> pSt3;
pSt3 = pSt2; // ok
pSt3->DoSomething();
// weak_ptr
std::tr1::weak_ptr<CTest> pWt(pSt);
std::tr1::shared_ptr<CTest> pWtlock = pWt.lock();
// pWt->SetId(12345); // error weak_ptr can‘t used directly
// pWt->DoSomething(); // error
if (pWtlock == pSt)
{
std::cout << "pWt up to shared_ptr ok!\n";
pWtlock->SetId(12345);
pWtlock->DoSomething();
}
// shared_array
boost::shared_array<CTest> pVecSt(new CTest[2]);
pVecSt[0].SetId(888);
pVecSt[0].DoSomething();
// auto_ptr
std::auto_ptr<CTest> pAt(new CTest);
pAt->SetId(789);
pAt->DoSomething();
std::auto_ptr<CTest> pAt2(pAt);
pAt2->DoSomething();
std::auto_ptr<CTest> pAt3;
pAt3 = pAt2;
pAt3->DoSomething();
std::cout << "pAt = " << pAt.get() << std::endl; // !!!
std::cout << "pAt2 = " << pAt2.get() << std::endl;
return 0;
}
运行结果:
$ ./a.out id :123-DoSomething id :111-DoSomething id :999-DoSomething id :999-DoSomething id :999-DoSomething pWt up to shared_ptr ok! id :12345-DoSomething id :888-DoSomething id :789-DoSomething id :789-DoSomething id :789-DoSomething pAt = 0 pAt2 = 0 id :789-Destuctor isbeing called id :0-Destuctor isbeing called id :888-Destuctor isbeing called id :12345-Destuctor isbeing called id :0-Destuctor isbeing called id :111-Destuctor isbeing called id :123-Destuctor isbeing called
总结:
auto_ptr作为早期C++标准库函数因其诡异的行为而被诟病(被复制后原指针为NULL)
shared_ptr和weak_ptr已经纳入了std::tr1标准库内,引用计数型智能指针行为正常,一般和weak_ptr配合使用
shared_array用于new[]的智能数组指针,scoped_ptr,scoped_array和shared类似但不容许复制行为,它们都定义在boost库内,不属于标准C++库,不建议在工作环境中使用
原文:http://my.oschina.net/xlplbo/blog/330655