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

时间:2015-06-20 10:34:09

标签: c++ c++11 move-semantics

说我有一个带有标准容器的课程:

class Library{
    std::vector<Book> books;
public:
    void putOnFire(){
        books.clear();
    }
};

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

void putOnFire(){
    auto p = std::move(books); //books cleared when p out of scope
}

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

3 个答案:

答案 0 :(得分:5)

std::move使移动的对象保持有效但未指定的状态。特别是它可能保持原样,所以虽然这实际上可能与stl的实现有关,但它肯定不适用于所有第三方容器。 (并且在将来由于更新而导致stl的实现发生变化时,可能会在任何时候中断)

答案 1 :(得分:3)

我不推荐这个。首先,它掩盖了意图。使用/*** begin our session ***/ session_start(); $app = new \Slim\Slim(array( 'view' => new \Slim\Views\Twig() )); $csrfTokenGenerator = function () { $form_token = md5( uniqid('auth', true) ); $_SESSION['form_token'] = $form_token; }; $app->get('/login', $csrfTokenGenerator, function() use ($app) { $app->render('login.twig'); })->name('login'); c.clear。没有擦除/删除元素的容器不是合适的动态大小的容器。此外,您提出的解决方案取决于特定容器类型的移动构造函数,它是实现定义的,不必释放内存。

作为最后的手段,我建议使用c.erase(c.begin(), c.end())代替建议的移动。

答案 2 :(得分:2)

向量可以释放其内存:

void putOnFire()
{
    books.clear();
    books.shrink_to_fit();
}

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

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