std :: shared_ptr的错误用法,有人可以帮忙指出问题所在吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: shared_ptr的错误用法,有人可以帮忙指出问题所在吗?相关的知识,希望对你有一定的参考价值。

我清楚地知道下面的前一个代码是错误的,因为它两次释放资源。但是我的问题是,后一个(检查https://godbolt.org/z/ndsHtX)是否正确。也许是正确的,因为终止输出。我应该意识到的任何潜在问题?我很高兴在这个问题上有所帮助。

错误代码:

#include<memory>
#include<iostream>

using std::shared_ptr;

struct S

  shared_ptr<S> dangerous()
  
     return shared_ptr<S>(this);   // don't do this!
  

  ~S()
  
      std::cout << "destructor" << std::endl;
  
;

int main()

   shared_ptr<S> sp1(new S);
   shared_ptr<S> sp2 = sp1->dangerous();
   return 0;

我不确定是对还是错:

#include<memory>
#include<iostream>

using std::shared_ptr;

class S

  public: 
    //S() = delete;
    int m_num;

  public:
    static shared_ptr<S> dangerous()
    
        return make_shared<S>();   // don't do this!
    

    void setNum(int num)
    
        m_num = num;
    


    ~S()
    
        std::cout << "destructor" << std::endl;
    
;

int main()

   shared_ptr<S> sp1 = S::dangerous();
   shared_ptr<S> sp2 = sp1;

   std::cout << sp1.use_count() << std::endl;
   std::cout << sp2.use_count() << std::endl;

   sp1.get()->setNum(99);
   sp1.get()->m_num;

   std::cout << "hello" << std::endl;
   return 0;

答案

您的第二个程序很好(尽管没有意义,因为return shared_ptr<S>()返回一个空指针,除非将其取消引用,否则它不会是危险的。)>

以上是关于std :: shared_ptr的错误用法,有人可以帮忙指出问题所在吗?的主要内容,如果未能解决你的问题,请参考以下文章

这是 std::vector 和 std::shared_ptr 内存泄漏的错误吗?

命名空间“std”中没有名为“shared_ptr”的类型

std::initializer_list 中的 std::shared_ptr 似乎过早地被破坏

std::shared_ptr 在不同计算机上与 MSVC 崩溃?

shared_ptr和动态数组

c++11智能指针(一) shared_ptr