主页 > 创业  > 

条款13:以对象管理资源

条款13:以对象管理资源
1.本文复用的代码如下(区别在main函数): #include <iostream> #include <memory> class A { public: A(){std::cout << "A" << std::endl;} ~A(){std::cout << "~A" << std::endl;} }; // 堆区开辟A类的空间 A* CreateA() { return new A; } //A管理类 class AManager { public: AManager(A* Geta):a(Geta){std::cout << "AManager" << std::endl;} ~AManager(){delete a; std::cout << "~AManager" << std::endl;} private: A* a; }; 2.成对的new 和delete 也可能造成内存泄漏 如下情况可能出现内存泄漏 int main() { A* a = new A; //... 程序抛出异样,goto语句,提前return等 delete a; } 3.解决思路1:栈对象管理堆区资源 int main() { //栈对象管理堆区资源 AManager manager(CreateA()); return 0; }  结果 A AManager ~A ~AManager 4.解决思路2:智能指针管理如unique_ptr模板类管理 int main() { std::unique_ptr<A> uniquePtrManager(CreateA()); return 0; }  结果 A ~A 5.unique_ptr reset()和release()的区别 unique_ptr reset()释放掉管理的堆内存 int main() { std::unique_ptr<A> uniquePtrManager(CreateA()); uniquePtrManager.reset(); std::cout << "end............" << std::endl; return 0; } 结果 A ~A end............ unique_ptr release()造成内存泄漏 int main() { std::unique_ptr<A> uniquePtrManager(CreateA()); uniquePtrManager.release(); std::cout << "end............" << std::endl; return 0; } 结果 A end............ 需要改成 int main() { std::unique_ptr<A> uniquePtrManager(CreateA()); std::cout << "end............" << std::endl; std::unique_ptr<A> getUniquePtr(uniquePtrManager.release()); return 0; }  输出 A end............ ~A

标签:

条款13:以对象管理资源由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“条款13:以对象管理资源