写一段代码练习使用try catch语句,在程序中用new分配内存时,如果操作未成功,则用try语句触发一个char类型异常,用catch语句捕获此异常
时间: 2023-07-19 18:33:08 浏览: 180
好的,下面是一段简单的示例代码,演示如何使用`try-catch`语句来捕获`new`操作失败时抛出的异常:
```c++
#include <iostream>
using namespace std;
int main() {
try {
int* p = new int[10000000000000];
delete[] p;
}
catch (char c) {
cout << "Caught an exception: " << c << endl;
}
return 0;
}
```
在这个示例中,我们使用`new`操作分配了一个超大的int数组,这个操作很可能会失败。如果分配失败,我们手动抛出一个char类型的异常。在`main()`函数中,我们使用`try-catch`语句捕获这个异常,并打印出相应的错误信息。
需要注意的是,这个示例中手动抛出的异常是一个char类型的异常,这是因为C++标准库中已经有了一些预定义的异常类(比如`std::bad_alloc`),我们应该尽量使用这些预定义的异常类来表示不同的异常情况。在实际开发中,我们也可以自定义一些异常类来表示特定的异常情况,以便我们的程序能够更加清晰地表达出异常信息。
相关问题
内存分配异常。练习使用try,catch语句,在程序中用 new 分配内存时,如果操作未成功,则用try语句触发一个exception类型异常e,用 catch 语句捕获此异常,之后通过e.what()获取exception类型异常的错误信息并打印。 bonus:尝试增大new分配空间的大小,多大的时候会出错?写个程序确定一下分配空间大于哪一个值得时候new会出问题,出的什么问题。
以下是一个使用try-catch语句捕获内存分配异常的示例代码:
```c++
#include <iostream>
#include <exception>
using namespace std;
int main() {
int size;
cout << "请输入要分配的空间大小:";
cin >> size;
try {
int* arr = new int[size];
cout << "内存分配成功!" << endl;
delete[] arr;
}
catch (exception& e) {
cout << "内存分配失败,错误信息:" << e.what() << endl;
}
return 0;
}
```
当我们输入一个较大的数值时,比如2147483647(int类型的最大值),就会触发std::bad_alloc异常,提示内存分配失败。这是因为程序在尝试分配这么大的空间时,已经超出了系统可用的内存范围。
我们可以通过不断增大分配空间的大小,来观察程序在何时会出现内存分配失败的情况,例如:
```c++
#include <iostream>
#include <exception>
using namespace std;
int main() {
for (int i = 1; i <= 1000000; i++) {
try {
int* arr = new int[i];
delete[] arr;
}
catch (exception& e) {
cout << "分配 " << i << " 个int类型的空间时发生内存分配异常,错误信息:" << e.what() << endl;
break;
}
}
return 0;
}
```
在我的机器上运行结果显示,分配524288个int类型的空间时就会触发std::bad_alloc异常,提示内存分配失败。
声明一个异常类CException,它有成员函数Reason,它用来显示异常的类型,在子函数中触发异常,在主程序中处理异常,观察程序的执行流程,编写程序lab12_1.cpp。在CException类的成员函数Reason()中用cout显示异常的类型,在函数fn1()中用throw语句触发异常,在主函数的try模块中调用fn1(),在catch模块中捕获异常
好的,以下是相应的代码:
```c++
#include <iostream>
using namespace std;
class CException {
public:
CException(string reason) : m_reason(reason) {}
void Reason() { cout << "Exception: " << m_reason << endl; }
private:
string m_reason;
};
void fn1() {
throw CException("Error occurred in fn1()");
}
int main() {
try {
fn1();
}
catch (CException& e) {
e.Reason();
}
return 0;
}
```
程序的执行流程如下:
1. 程序开始执行,进入main函数;
2. 在try块中调用fn1函数;
3. fn1函数中使用throw语句抛出一个CException类型的异常,程序跳转到catch块中;
4. catch块中捕获到异常,并调用异常类CException的成员函数Reason()显示异常信息;
5. 程序结束。
希望这个例子对你有所帮助!
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)