假设我有一个管理指向内部缓冲区的指针的类:
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]; }
如果我还实现了移动语义,那么只复制指针并移动缓冲区是否安全?
Foo::Foo(Foo&& f) : m_buffer(std::move(f.m_buffer)),m_pointer(f.m_pointer) { }
在实践中,我知道这应该工作,因为std :: vector移动构造函数只是移动内部指针 – 它实际上并没有重新分配任何东西,所以m_pointer仍然指向一个有效的地址.但是,我不确定标准是否可以保证这种行为. std :: vector移动语义是否保证不会发生重新分配,因此向量的所有指针/迭代器都是有效的?
解决方法
原文地址:https://www.jb51.cc/c/114003.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。