C++移动语义对数据结构的影响:类成员deque状态与内存泄漏问题
问题解答
先澄清代码与描述的差异
你提到用unique_ptr管理deque作为类成员,但提供的代码里直接声明了deque<type> m_q,并未使用智能指针。下面分两种场景解答你的疑问,同时修正代码里的逻辑问题。
场景1:直接持有deque作为成员(对应你提供的代码结构)
你的getQedEvent函数当前是接收外部deque引用并返回其右值引用,这和你“返回类成员deque”的需求不符。如果要返回类成员m_q,正确的函数实现应该是:
deque<type>&& getQedEvent() { return move(m_q); }
- 移动后类成员的状态:执行
std::move(m_q)并返回右值引用后,m_q的所有元素会被转移到新容器中,m_q自身会变成一个合法的空容器(不是无效对象,仍可正常调用push_back、clear等成员函数)。标准库容器的移动语义保证源对象处于“有效但未指定”状态,而deque的主流实现都会将源容器置空。 - 内存泄漏问题:完全不会泄漏。移动语义只是转移容器内部资源的所有权,不会产生内存泄漏。当类对象销毁时,
m_q的析构函数会正常执行,清理自身剩余的资源(此时为空容器,无额外内存需要释放)。
场景2:用unique_ptr管理deque作为成员(对应你的描述)
如果确实是用智能指针持有deque,代码结构如下:
class test { unique_ptr<deque<type>> m_q = make_unique<deque<type>>(); public: void qEvent(type t) { m_q->emplace_back(move(t)); } unique_ptr<deque<type>> getQedEvent() { return move(m_q); } };
- 移动后类成员的状态:
unique_ptr的移动语义会把源指针置为nullptr,也就是m_q不再持有任何deque对象的所有权。 - 内存泄漏问题:同样不会泄漏。
deque的所有权被转移到返回的unique_ptr中,当这个返回的智能指针销毁时,会自动释放deque占用的内存。
代码修正建议
如果你需要返回类成员m_q的移动对象,建议修改getQedEvent函数,去掉外部参数,直接返回类成员的右值引用,如场景1中的代码所示。
内容的提问来源于stack exchange,提问作者Kaushal Singh
相关产品推荐
相关产品推荐

