假设我有一个管理指向内部缓冲区的指针的类:
class Foo
{
public:
Foo();
...
private:
std::vector<unsigned char> m_buffer;
unsigned char* m_pointer;
};
Foo::Foo()
{
m_buffer.resize(100);
m_pointer = &m_buffer[0];
}
现在,假设我也正确地实现了 3 条规则,包括复制内部缓冲区的复制构造函数,然后将指针重新分配给内部缓冲区的新拷贝:
Foo::Foo(const Foo& f)
{
m_buffer = f.m_buffer;
m_pointer = &m_buffer[0];
}
如果我还实现了 move 语义,那么只复制指针并 move 缓冲区是否安全?
Foo::Foo(Foo&& f) : m_buffer(std::move(f.m_buffer)), m_pointer(f.m_pointer)
{ }
实际上,我知道这应该可行,因为 std::vector
move 构造函数只是 move 内部指针 - 它实际上并没有重新分配任何东西,所以 m_pointer
仍然指向到一个有效的地址。但是,我不确定标准是否保证了这种行为。 std::vector
move 语义是否保证不会发生重新分配,因此指向 vector 的所有指针/迭代器都是有效的?
最佳答案
我会再次执行 &m_buffer[0]
,只是为了让您不必问这些问题。这显然不是很直观,所以不要这样做。而且,这样做,您不会有任何损失。双赢。
Foo::Foo(Foo&& f)
: m_buffer(std::move(f.m_buffer))
, m_pointer(&m_buffer[0])
{}
我对它很满意,主要是因为 m_pointer
是成员 m_buffer
的 View ,而不是严格意义上的成员.
这一切都在回避问题……为什么它在那里?不能公开一个成员函数给你&m_buffer[0]
吗?
关于c++ - 使用指向内部缓冲区的指针 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17880436/