c++智能指针多次初始化问题

最近学习c++ 智能指针,对智能指针初始化有些不解。

std::shared_ptr<> ptr;
ptr=std::make_shared<>;

初始化以后没有置空的情况下,重复第二个步骤,是否会造成内存问题?

一般不会出现问题,

share_ptr<int> test;
test=make_share<int>(1);//这里 make_share<int>(1) 返回一个临时变量,然后调用opeartor= 给test赋值,你查看源代码会发现他会交换 test和那个临时变量的内部指针,然后那个临时变量会被销毁,不会有内存问题,
test=make_share<int>(2);

用share_ptr要注意是多个share_ptr是基于引用计数来确定是否释放内存,如果a引用了b,b反过来引用了a,形成循环,则无法释放

重复第二个步骤会导致内存泄漏,而不是内存问题。如有帮助给个采纳谢谢

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7774125
  • 这篇博客你也可以参考下:C++智能指针详解(共享指针,唯一指针,自动指针)
  • 除此之外, 这篇博客: 【C++】智能指针详解中的 1.1 什么是智能指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。

    动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源


  • 您还可以看一下 夏曹俊老师的C++ 11 14 17 20内存管理-指针、智能指针和内存池课程中的 各种内存空间-堆_栈_全局地址代码演示小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案

    1. 如何正确地初始化C++智能指针?

    在C++中,有几种方式可以正确地初始化C++智能指针:

    • 使用new关键字和构造函数进行初始化
    std::shared_ptr<int> p(new int(10));
    
    • 使用std::make_shared函数进行初始化(推荐使用)
    std::shared_ptr<int> p = std::make_shared<int>(10);
    

    以上两种方式都可以创建一个动态分配的int类型对象,并将其指针传递给shared_ptr。

    1. 如果没有将智能指针置为空值,在重复进行第二个步骤时是否会导致内存问题?

    如果没有将智能指针置为空值,在重复进行第二个步骤时可能会导致内存泄漏或悬空指针问题。

    内存泄漏:如果在进行第二个步骤之前没有释放先前分配的内存,那么内存泄漏可能会发生。为了避免这种情况,应该在重复使用智能指针之前将其重置为空:

    p.reset(); // 重置智能指针为空
    

    悬空指针:如果没有将智能指针重置为空,而是直接将其指向新的对象或释放内存,那么原来的指针将成为一个悬空指针。使用悬空指针可能会导致未定义的行为,应该避免这种情况。