如何测试C++类实例在预期场景下抛出异常?运行遇Abort trap:6
问题分析与解决
1. 「Abort trap: 6」错误的原因
你遇到的错误是因为未捕获到异常导致程序终止。你的pop函数抛出的是std::logic_error,但main里的catch块写的是logic_error&——如果代码里没有using namespace std;,编译器会认为logic_error是未定义类型,这个catch块根本无法捕获到std::logic_error异常,最终触发程序abort。
修正方法二选一:
- 在
main函数开头添加using namespace std;(小测试场景可用,大型项目不推荐) - 把catch块的类型改为
std::logic_error&:catch (std::logic_error& e) { std::cerr << e.what() << std::endl; return -1; }
2. 测试预期场景抛出异常的正确方式
除了修正catch类型的问题,你可以通过以下方式验证异常行为:
- 确保测试代码覆盖所有异常触发条件(比如空栈调用
pop) - 手动测试时,若异常被正确捕获,程序会输出错误信息而非崩溃,这就说明异常抛出符合预期。
修正后的完整main示例:
#include <iostream> #include <stdexcept> // 假设Stack类的定义在此处 int main() { Stack s{}; try { s.pop(); } catch (std::logic_error& e) { std::cerr << e.what() << std::endl; return -1; } return 0; }
运行后会输出stack is empty,而非触发Abort错误。
3. 析构函数的内存泄漏修复
栈的析构函数需要手动遍历并释放每个节点的内存,示例实现如下:
Stack::~Stack() { while (top != nullptr) { Node* temp = top; top = top->next; // 假设节点有next指针指向栈的下一个元素 delete temp; } }
这样在栈对象销毁时,会逐个释放所有节点内存,解决泄漏问题。
内容的提问来源于stack exchange,提问作者Martin Wiklund
相关产品推荐
相关产品推荐

