c++ - 多次调用 make_shared() 时的 shared_ptr 垃圾回收

标签 c++ c++11 memory-leaks shared-ptr

我知道使用像 std::shared_ptr 这样的智能指针会在指针超出范围时添加垃圾回收,但我不清楚如果我调用垃圾回收是否也有效make_shared()在一个 shared_ptr 上多次。

例如:

std::shared_ptr<MyClass> mcPtr;

void assignment(int i)
{
  mcPtr = std::make_shared<MyClass>(i);
}

void main()
{
  assignment(5);

  // Some time later

  assignment(10);  // Does this cause a memory leak?
}

最佳答案

使用 std::shared_ptr不添加垃圾收集,但是当共享指针在范围末尾被销毁时,将调用在其声明的析构函数中。共享指针的析构函数处理释放内存。

现在当你调用 = std::shared_ptr::operator=()叫做。来自标准 20.8.2.2.3.4

Effect: Equivalent to shared_ptr(std::move(r)).swap(*this)

所以 mcPtr 被赋予新的 shared_ptr 的值,新的 shared_ptr 得到 mcPtr 的内容.然后新的 shared_ptr 超出范围,析构函数被调用,shared_ptr 自行处理。

关于c++ - 多次调用 make_shared() 时的 shared_ptr 垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32589023/

相关文章:

c++ - 由于模板基类,从不完整类型初始化静态 constexpr

c++ - 捕获具有特定模板参数的类

C++ 为什么原始 double 组中的赋值似乎比 double 变量赋值快得多?

c++ - 关于 C++ 标准中的第 12.7p3 段,我有以下问题

jakarta-ee - CDI |应用程序/从属范围 |内存泄漏 - javax.enterprise.inject.Instance<T> 未收集垃圾

c++ - C++调整行高

c++ - 将 void * 转换为类型的shared_ptr

c++ - 在具有外部链接的匿名命名空间中声明的实体示例

javascript - jQuery 的响应文本的 AJAX 内存泄漏?

c++ - new[]和delete不匹配,为什么没有内存泄漏?