Clion中实现异常安全Stack时程序无响应问题求助
问题分析与解决思路
1. 程序挂起的直接原因:无限死循环
你实现的范围版本destroy函数存在逻辑错误:
template<typename FwdIt> void destroy(FwdIt begin, FwdIt end) { while(begin != end) { destroy(begin); } ++begin; }
++begin被写在while循环外部,循环体内没有移动迭代器,导致begin永远不会等于end,程序陷入无限死循环,直接表现为挂起无响应。
修复方法
将迭代器递增操作移到循环体内:
template<typename FwdIt> void destroy(FwdIt begin, FwdIt end) { while(begin != end) { destroy(std::addressof(*begin)); // 用addressof避免T重载&运算符的情况 ++begin; // 每次销毁后移动迭代器,推进循环 } }
2. 其他潜在严重问题(虽未触发当前挂起,但必须修复)
(1)内存分配的类型大小错误
构造函数中operator new的参数误用了sizeof(size_type),正确应该分配T类型的空间:
// 错误写法 operator new(sizeof(size_type) * capacity) // 正确写法 operator new(sizeof(T) * capacity)
size_type是std::size_t(通常8字节),若T是int(4字节),会导致分配空间超出需求;若T是更大的类型,会造成空间不足,后续操作触发未定义行为。
(2)析构函数销毁未构造的元素
当前~StackImpl()中调用destroy(m_ptr, m_ptr + m_capacity),但m_capacity是总容量,m_size才是实际构造的元素数量,应该只销毁已构造的元素:
~StackImpl() { my::destroy(m_ptr, m_ptr + m_size); // 用m_size代替m_capacity operator delete(m_ptr); }
目前m_size为0,暂时无问题,但后续实现push操作后,销毁未构造内存会引发严重未定义行为。
3. 验证修复
修复上述问题后重新编译运行,死循环问题会解决,程序可正常退出。后续实现push/pop等功能时,需继续保证异常安全(如通过RAII机制、避免资源泄漏、保证强异常安全等)。
内容的提问来源于stack exchange,提问作者Hayk
相关产品推荐
相关产品推荐

