【问题标题】:Does std::string move assignment causes memory leakstd::string 移动分配是否会导致内存泄漏
【发布时间】:2021-07-02 08:40:00
【问题描述】:

下面的程序有内存泄漏吗?

main()
{
std::string DD("paramhansa");
std::string SS("yogananda");

DD = std::move(SS);
}

请考虑字符串足够大以存储在堆中。

DD 指向的内存发生了什么变化? 它在移动任务中被破坏了吗? 这是内存泄漏吗?

【问题讨论】:

  • 移出的对象将保持可破坏状态。当它离开的时候,析构函数将在SS 上被调用,而不影响DDDD 的旧值相同,它是安全管理的。
  • 你有什么证据表明会有内存泄漏?
  • 您认为标准库为什么会在其实现中允许内存泄漏?
  • DD = SS;一样,内存由std::string管理
  • 所以如果语句像 obj1 = std::move(obj2) ...... 会调用 obj1 的析构函数吗?自动

标签: c++ c++11 stdstring


【解决方案1】:

下面的程序有内存泄漏吗?

没有。

请考虑字符串足够大以存储在堆中。

仍然没有泄漏。

DD指向的内存怎么了?

澄清一下:DD 不是指针。当然,它可能包含指针作为可能指向某物的成员。

它在移动分配中被破坏了吗?

std::string 的赋值运算符可以释放该类先前分配的任何内存。

这是内存泄漏吗?

没有。

所以如果语句像 obj1 = std::move(obj2) ...... 会调用 obj1 的析构函数吗?自动

没有。将调用赋值运算符。

【讨论】:

    【解决方案2】:

    它在移动分配中被破坏了吗?

    是的。

    这是内存泄漏吗?

    没有。

    std::string 的移动赋值运算符负责确保在这种情况下没有泄漏。

    当然,除非您的标准库实现存在错误。

    【讨论】:

    • 所以如果语句像 obj1 = std::move(obj2) ...... 会调用 obj1 的析构函数吗?自动
    • obj1 的旧字符串内存在此时被释放(但没有调用析构函数)。函数返回时调用析构函数,obj1 将释放它的新字符串,而 obj2 不会释放任何东西,因为它现在是空的
    • @RishiN 不,移动分配操作员的任务是管理obj1obj2的资源,以免发生资源泄漏。
    • 谢谢你........ c++ 是一门复杂的语言,可能是人们远离它的原因
    • 不保证在move assignment中会释放内存。例如,一种实现可能只是交换两个字符串的内部指针
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多