C++编程:异常处理与动态内存管理

需积分: 0 0 下载量 17 浏览量 更新于2024-08-04 收藏 219KB DOCX 举报
"nderflow!"<<endl; exit(1); } catch(DELETE_NULL_PTR_TYPEd) { cerr<<"Delete null pointer!"<<endl; exit(1); } return0; } 本段代码是一个C++程序,主要展示了如何处理和管理内存异常,以及自定义异常类型来处理栈操作中的错误。程序中定义了一个名为`Stack`的类,用于表示一个动态数组实现的栈,并在类的构造函数、`push_back`和`pop_back`方法中抛出自定义异常。此外,还展示了如何使用try-catch语句捕获和处理这些异常。 1. 异常处理: - 异常1:动态内存申请失败。通过定义`BAD_NEW`常量并检查`new`操作的结果,当内存分配失败时,抛出`BAD_NEW_TYPE`异常。 - 异常2:上溢。当栈满尝试添加元素时,抛出`OVERFLOW_TYPE`异常。 - 异常3:下溢。当栈空尝试删除元素时,抛出`UNDERFLOW_TYPE`异常。 - 异常4:删除空指针。检查指针是否为空,如果为空则抛出`DELETE_NULL_PTR_TYPE`异常。 2. `Stack`类: - `Stack`类的成员变量包括一个指向整型数组的指针`p`,一个当前元素计数器`N`,和一个最大容量`max`。 - 构造函数接受一个整数`num`作为参数,动态分配一个大小为`num`的整型数组。如果分配失败,抛出`BAD_NEW`异常。 - `push_back`方法用于向栈中添加元素,如果栈已满,抛出`OVERFLOW_TYPE`异常。 - `pop_back`方法用于从栈中删除元素,如果栈为空,抛出`UNDERFLOW_TYPE`异常。 - 析构函数检查指针是否为空,如果非空,则释放动态分配的内存。 3. 主函数`main`: - 输入两个整数`a`和`b`,然后尝试为`a`个元素分配内存。如果分配失败,抛出`BAD_NEW_TYPE`异常。 - 创建一个大小为5的`Stack`对象`s`,然后将前`a`个自然数压入栈。 - 进行`b`次`pop_back`操作,可能触发`UNDERFLOW_TYPE`异常。 - 尝试删除一个空指针,如果指针为空,抛出`DELETE_NULL_PTR_TYPE`异常。 4. 异常捕获: - 使用try-catch语句捕获可能抛出的自定义异常类型,对每个异常类型分别进行错误处理并退出程序。 - 当捕获到异常时,输出相应的错误信息,并调用`exit(1)`结束程序。 总结,这段代码着重展示了如何在C++中自定义异常类型来处理内存分配错误和栈操作错误,并通过try-catch机制进行异常处理。通过对`Stack`类的设计,我们可以更好地管理和控制内存,以及避免因不当操作导致的潜在问题。