首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用std::move()释放内存?

用std::move()释放内存?
EN

Stack Overflow用户
提问于 2015-06-20 10:34:09
回答 3查看 326关注 0票数 0

说我有一个有标准容器的类:

代码语言:javascript
复制
class Library{
    std::vector<Book> books;
public:
    void putOnFire(){
        books.clear();
    }
};

清除容器的通常方法是“清除”,但是大多数代码不符合"STL兼容“,因此许多容器(由第三方)可能没有”清除“方法。但是,如果他们有移动语义,我可以只使用std::move对吗?

代码语言:javascript
复制
void putOnFire(){
    auto p = std::move(books); //books cleared when p out of scope
}

这是为了编写大多数通用的可能代码,这些代码也适用于不具有“清除”方法的STL容器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-20 10:45:28

std::move使移出对象处于有效但未指定的状态。特别是,它可能会保持原样,因此,虽然这可能实际上适用于stl的实现,但它肯定不会适用于所有第三方容器。(将来当stl的实现由于更新而发生更改时,可能会中断)

票数 5
EN

Stack Overflow用户

发布于 2015-06-20 10:39:58

我不推荐这个。首先,它掩盖了意图。可以使用c.clearc.erase(c.begin(), c.end())。没有方法删除/删除元素的容器不是一个适当的动态大小容器。此外,所建议的解决方案依赖于特定容器类型的移动构造函数,该构造函数是实现定义的,因此必须不释放内存。

最后,我建议使用swap,而不是建议的移动。

票数 3
EN

Stack Overflow用户

发布于 2015-06-20 13:09:28

载体可以释放其内存:

代码语言:javascript
复制
void putOnFire()
{
    books.clear();
    books.shrink_to_fit();
}

如果您正在使用某个不是标准容器的容器,那么您必须查阅它的文档,看看它支持什么操作。

编写具有未知接口的容器的代码是不可能的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30952988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档