【问题标题】:Does std::string::clear and std::list::clear erases data from memorystd::string::clear 和 std::list::clear 是否从内存中擦除数据
【发布时间】:2013-07-10 19:45:06
【问题描述】:

在 string::clear 函数的描述中,它说:

clear:擦除字符串的内容,变成空字符串(长度为0个字符)。

在 list::clear 函数的描述中,它说:

clear:从列表容器中移除所有元素(被销毁),并留下大小为 0 的容器。

清除是覆盖字符串和列表的内存还是只是释放它们?

【问题讨论】:

  • 都不释放内存。 C++11 提供了一个shrink_to_fit 成员函数,它至少请求实现这样做。
  • @CodyGray:如果std::list 没有释放clear() 上的内存,我会感到惊讶......你可能正在考虑std::vector
  • @DavidRodríguez-dribeas - 允许实现缓存列表节点以供将来重用。在我看来,Rogue Wave 的图书馆在这方面做了很多。
  • @PeteBecker:是的,我们自己的实现就是这样做的,但从概念上讲,内存已经被释放。这里也没有shrink_to_fit 可以帮助列表,因为节点仍将由库缓存。
  • @DavidRodríguez-dribeas - 这可能越来越技术化了,但我得到的区别是,当你“释放”内存时,它通常意味着内存回到免费存储,并且是可在程序的任何地方重复使用;将其释放到节点缓存使其可用于相同大小的节点,但不适用于一般用途。毫无疑问,这不是这个问题的重点。 <g>

标签: c++ string list


【解决方案1】:

这两个函数都不需要覆盖已擦除的数据。

【讨论】:

  • +1 事实上,在发布版本中我会假设它没有被覆盖。
【解决方案2】:

内存没有被覆盖。它甚至不能保证被释放。

例如,如果您创建一个巨大的字符串并在其上调用clear,则只会减小其大小,但仍可能保留分配的内存。但是,如果字符串超出范围,它将被释放。

std::list至少保证了如果清空列表,列表内的元素会被破坏。

因此,如果您的内存中包含敏感数据,您应该手动覆盖它们。

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2016-10-27
    相关资源
    最近更新 更多