You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:35:24