最近学习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,形成循环,则无法释放
重复第二个步骤会导致内存泄漏,而不是内存问题。如有帮助给个采纳谢谢
智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。
动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源
在C++中,有几种方式可以正确地初始化C++智能指针:
std::shared_ptr<int> p(new int(10));
std::shared_ptr<int> p = std::make_shared<int>(10);
以上两种方式都可以创建一个动态分配的int类型对象,并将其指针传递给shared_ptr。
如果没有将智能指针置为空值,在重复进行第二个步骤时可能会导致内存泄漏或悬空指针问题。
内存泄漏:如果在进行第二个步骤之前没有释放先前分配的内存,那么内存泄漏可能会发生。为了避免这种情况,应该在重复使用智能指针之前将其重置为空:
p.reset(); // 重置智能指针为空
悬空指针:如果没有将智能指针重置为空,而是直接将其指向新的对象或释放内存,那么原来的指针将成为一个悬空指针。使用悬空指针可能会导致未定义的行为,应该避免这种情况。