• C++PrimerPlus(第6版)中文版:Chapter16.2智能指针模版类smrtptrs.cpp


    本小节讲智能指针模版类。

    智能指针是行为类似于指针的类对象。

    1. void remodel(std::string &str)
    2. {
    3. string * ps=new string(str);
    4. ...
    5. str=*ps;
    6. return;
    7. }

    每当调用的时候,该函数都会分配堆中的内存,但从不收回,从而导致内存泄漏

    解决之道就是可以在return语句之前添加下面的delete语句,即可

    delete ps;这样就可以释放内存了。

    但是,涉及到别忘了,实际中就会发生忘记的情况,不是最佳的解决方案。来看看需要怎么做呢?

    当remodel()这样的函数终止的时候,本地变量都将从栈内存中删除。因此,指针ps占据的内存将被释放,如果ps指向的内存也被释放,该有多好!,如果ps有一个析构函数,该析构函数在ps过期的时候释放它所指向的内存。因此,ps的问题在于它只是一个常规的指针,它不是具有析构函数的对象。如果它是对象,那么对象过期的时候,让它的析构函数删除指向的内存。这就是:auto_ptr  、unique_ptr、shared_ptr 背后的思想。auto_ptr 是C++98提供的解决方案,C++11已经将它抛弃,并提供了另外的两种解决方案。

    这三个智能指针模版(auto_ptr  、unique_ptr、shared_ptr)都定义了类似指针的对象,可以将new获得(直接或者间接)的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内存,自动就释放了。

    要创建智能指针对象,必须包含投文件memory,该文件包括模版定义。

    程序清单16.5 smrtptrs.cpp

    1. // Example16.5_smrtptrs.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include
    4. #include
    5. #include
    6. using std::cout;
    7. class Report
    8. {
    9. private:
    10. std::string str;
    11. public:
    12. Report(const std::string s) :str(s)
    13. {
    14. cout << "Object Created!\n";
    15. }
    16. ~Report(){cout<< "Object Deleted!\n";}
    17. void comment()const{ cout << str<<"\n"; }
    18. };
    19. int main()
    20. {
    21. // std::cout << "Hello World!\n";
    22. {
    23. std::auto_ptr ps(new Report("Using auto_ptr"));
    24. ps->comment();//use -> to invoke a member function
    25. }
    26. {
    27. std::shared_ptr ps(new Report("Using shared_ptr"));
    28. ps->comment();//use -> to invoke a member function
    29. }
    30. {
    31. std::unique_ptr ps(new Report("Using unique_ptr"));
    32. ps->comment();//use -> to invoke a member function
    33. }
    34. }

    结果:

    1. Object Created!
    2. Using auto_ptr
    3. Object Deleted!
    4. Object Created!
    5. Using shared_ptr
    6. Object Deleted!
    7. Object Created!
    8. Using unique_ptr
    9. Object Deleted!

    这三个种,auto_ptr 已经过时,unique和share的使用还是有一些区别,具体在这里不展开了,掌握这种思想很重要,析构函数中释放内存这样真不错。

  • 相关阅读:
    【Docker】03-安装redis
    Bitmap实现原理&应用场景
    Java程序设计2023-第四次上机练习
    第十九章 Java绘图
    性能测试 —— Jmeter接口处理不低于200次/秒-场景
    黑马瑞吉外卖之文件上传和下载
    Q-Learning笔记
    go的解析命令行库flag
    算法----数组常见知识点
    JavaScript---BOM和DOM
  • 原文地址:https://blog.csdn.net/superfreak/article/details/126722861