为我自己的std :: vector实现移动语义

时间:2016-06-22 12:44:13

标签: c++11 move-semantics

在给定内部字段数据,大小和容量的情况下,如何为std :: vector实现移动原理图? 如何使这个线程安全?

#include <utility>

class vec {
public: 
    vec(vec&& o) : size(o.size), capacity(o.capacity), data(std::move(o.data))
    {}

    vec& operator=(vec&& o)
    {
        if (this != &o) {
            size = o.size;
            capacity = o.capacity;
            delete[] data;
            data = o.data;
            o.data = nullptr;
        }
        return *this;
    }

    vec(vec&) = delete;                         // disable copying
    vec& operator=(vec&) = delete;  
    vec& operator=(vec&) const = delete;

    int* data;
    size_t size;
    size_t capacity;
};

1 个答案:

答案 0 :(得分:3)

几点:

  • 我不认为你会在原始指针上使用std::move。你会的 使用data = o.data指定指针,然后手动将旧指针设置为空o.data = nullptr
  • 根据定义,如果您正在移动一个对象,那么您假设没有其他线程会使用您正在移动的对象,否则您不应该移动它,因此您不会在移动分配中强制执行线程安全运算符,您将确保其余代码中的线程安全。