智能指针可以解决上面遇到的问题。
class ManagedObj { public: ManagedObj(int val = 0):m_val(val) { cout<<"Obj : "<<m_val<<endl; } ~ManagedObj() { cout<<"~Obj : "<<m_val<<endl; } void testFun() { cout<<"testFun : "<<m_info<<endl; } public: string m_info; int m_val; };
// std::auto_ptr void testAutoPtr1() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { atPtr->testFun(); atPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用 atPtr->testFun(); (*atPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象 (*atPtr).testFun(); } }
void testAutoPtr2() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { auto_ptr<ManagedObj> atPtr2; atPtr2 = atPtr; // 原因在这行代码 atPtr2->testFun(); atPtr->testFun(); // 崩溃在这行代码 } }
void testAutoPtr3() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { atPtr.release(); } }
void testAutoPtr3() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { //ManagedObj* temp = atPtr.release(); //delete temp; // 或者 atPtr.reset(); } }
// boost::scoped_ptr void testScopedPtr() { boost::scoped_ptr<ManagedObj> scPtr(new ManagedObj(1, " initialize")); if (scPtr.get()) { scPtr->testFun(); scPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用 scPtr->testFun(); (*scPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象 (*scPtr).testFun(); //scPtr.release(); // error scoped_ptr 没有成员release //boost::scoped_ptr<ManagedObj> scPtr2; //scPtr2 = scPtr; // error scoped_ptr<T>::operator=(const scoped_ptr<ManagedObj> &)不可访问 } }
// boost::shared_ptr void testSharedPtr(boost::shared_ptr<ManagedObj> ptr) { ptr->testFun(); cout<<"shared_ptr use_count: "<<ptr.use_count()<<endl; } void testSharedPtr1() { boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, " initialize")); if (shPtr.get()) { shPtr->testFun(); shPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用 shPtr->testFun(); (*shPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象 (*shPtr).testFun(); } cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl; testSharedPtr(shPtr); cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl; //shPtr.release(); // error shared_ptr 没有成员release }
// boost::scoped_array void testScopedArray() { boost::scoped_array<ManagedObj> scArr(new ManagedObj[2]); // 动态数组初始化 if (scArr.get()) { scArr[0].testFun(); scArr.get()[0].m_info += " [0] 1st append"; scArr[0].testFun(); //(*scArr)[0].m_info += " 2st append"; // error scoped_array没有重载operator* //(*scArr)[0].testFun(); //scArr[0].release(); // error scoped_array 没有成员release boost::scoped_array<ManagedObj> scArr2; //scArr2 = scArr; // error operator=不可访问 屏蔽了operator= 禁止拷贝 } }
// boost::shared_array void testSharedArray(boost::shared_array<ManagedObj> pArr) { cout<<"shared_arr use_count: "<<pArr.use_count()<<endl; boost::shared_array<ManagedObj> pTempArr; pTempArr = pArr; cout<<"shared_arr use_count: "<<pArr.use_count()<<endl; } void testSharedArray1() { boost::shared_array<ManagedObj> shArr(new ManagedObj[2]); if (shArr.get()) { shArr[0].testFun(); shArr.get()[0].m_info += " [0] 1st append"; shArr[0].testFun(); shArr[1].testFun(); shArr.get()[0].m_info += " [1] 1st append"; shArr[1].testFun(); //(*shArr)[0].m_info += " [0] 2nd append"; // error 没有重载operator*操作符 } cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl; testSharedArray(shArr); cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl; }
// boost::weak_ptr void testWeakPtr() { boost::weak_ptr<ManagedObj> wPtr; boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, "initialize")); cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl; wPtr = shPtr; cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl; }
OK 到这儿为止,七种智能指针基本上都大致介绍完了。
参考:
http://blog.csdn.net/xt_xiaotian/article/details/5714477
完整的代码在这里。
#include <iostream> #include <memory> #include <string> #include <boost/smart_ptr.hpp> // add header file // namespace using namespace std; using namespace boost; // heap obj class class ManagedObj { public: ManagedObj(int val = 0, string info = "") :m_val(val), m_info(info) { cout<<"Obj : "<<m_val<<m_info<<endl; } ~ManagedObj() { cout<<"~Obj : "<<m_val<<m_info<<endl; } void testFun() { cout<<"testFun : "<<m_info<<endl; } public: string m_info; int m_val; }; // std::auto_ptr void testAutoPtr1() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { atPtr->testFun(); atPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用 atPtr->testFun(); (*atPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象 (*atPtr).testFun(); } } void testAutoPtr2() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { auto_ptr<ManagedObj> atPtr2; atPtr2 = atPtr; atPtr2->testFun(); atPtr->testFun(); } } void testAutoPtr3() { auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize")); if (atPtr.get()) // 判断智能指针是否为空 { //ManagedObj* temp = atPtr.release(); //delete temp; // 或者 atPtr.reset(); } } // boost::scoped_ptr void testScopedPtr() { boost::scoped_ptr<ManagedObj> scPtr(new ManagedObj(1, " initialize")); if (scPtr.get()) { scPtr->testFun(); scPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用 scPtr->testFun(); (*scPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象 (*scPtr).testFun(); //scPtr.release(); // error scoped_ptr 没有成员release //boost::scoped_ptr<ManagedObj> scPtr2; //scPtr2 = scPtr; // error scoped_ptr<T>::operator=(const scoped_ptr<ManagedObj> &)不可访问 } } // boost::shared_ptr void testSharedPtr(boost::shared_ptr<ManagedObj> ptr) { ptr->testFun(); cout<<"shared_ptr use_count: "<<ptr.use_count()<<endl; } void testSharedPtr1() { boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, " initialize")); if (shPtr.get()) { shPtr->testFun(); shPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用 shPtr->testFun(); (*shPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象 (*shPtr).testFun(); } cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl; testSharedPtr(shPtr); cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl; //shPtr.release(); // error shared_ptr 没有成员release } // boost::scoped_array void testScopedArray() { boost::scoped_array<ManagedObj> scArr(new ManagedObj[2]); // 动态数组初始化 if (scArr.get()) { scArr[0].testFun(); scArr.get()[0].m_info += " [0] 1st append"; scArr[0].testFun(); //(*scArr)[0].m_info += " 2st append"; // error scoped_array没有重载operator* //(*scArr)[0].testFun(); //scArr[0].release(); // error scoped_array 没有成员release boost::scoped_array<ManagedObj> scArr2; //scArr2 = scArr; // error operator=不可访问 屏蔽了operator= 禁止拷贝 } } // boost::shared_array void testSharedArray(boost::shared_array<ManagedObj> pArr) { cout<<"shared_arr use_count: "<<pArr.use_count()<<endl; boost::shared_array<ManagedObj> pTempArr; pTempArr = pArr; cout<<"shared_arr use_count: "<<pArr.use_count()<<endl; } void testSharedArray1() { boost::shared_array<ManagedObj> shArr(new ManagedObj[2]); if (shArr.get()) { shArr[0].testFun(); shArr.get()[0].m_info += " [0] 1st append"; shArr[0].testFun(); shArr[1].testFun(); shArr.get()[1].m_info += " [1] 1st append"; shArr[1].testFun(); //(*shArr)[0].m_info += " [0] 2nd append"; // error 没有重载operator*操作符 } cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl; testSharedArray(shArr); cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl; } // boost::weak_ptr void testWeakPtr() { boost::weak_ptr<ManagedObj> wPtr; boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, "initialize")); cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl; wPtr = shPtr; cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl; } // boost::intrusive_ptr void testIntrusivePtr() { //boost::intrusive_ptr<ManagedObj> intPtr(new ManagedObj[1], false); // error 要自己添加引用计数 } // main function int main(void) { // -----std::auto_ptr----- //testAutoPtr(); //testAutoPtr2(); //testAutoPtr3(); // -----boost::scoped_ptr----- //testScopedPtr(); // -----boost::shared_ptr----- //testSharedPtr1(); // -----boost::scoped_array----- //testScopedArray(); // -----boost::shared_array----- //testSharedArray1(); // -----boost::weak_ptr----- testWeakPtr(); return 0; }