c++ try catch

#include 
#include 
#include 
#include 
using namespace std;


// 实际上分配的是虚拟地址,地址够用就不会分配失败 
// 64位处理器可用地址是 2 48次方,因为不需要这么大的寻址控件,过大的控件只会导致资源浪费,就是256t
void testNew()
{
	try 
	{
    		int* ptr = new int[100000000000000000]; // 尝试分配一个非常大的int数组,直接被catch掉了
		printf(" 分配结果: %p \n", ptr);
	}
	catch (std::bad_alloc& ex) 
	{
    		std::cout << "分配内存失败: " << ex.what() << std::endl;
	}
//	int* ptr = new int[100000000000000000]; // 尝试分配一个非常大的int数组,直接报错"terminate called after throwing an instance of 'std::bad_alloc'"挂掉
//        printf(" 分配结果: %p \n", ptr);
	
	int* ptr = new (std::nothrow) int[100000000000000000]; // 尝试分配一个非常大的int数组,返回nullptr, 不会挂掉
        printf(" 分配结果: %p \n", ptr);
	
	// 需要c++20 支持
//	auto pa1 = std::make_shared(5);
//	auto pa2 = std::make_shared();  //g++ -std=c++20 testTry.cpp	 仍然不支持

}

int main() 
{

//	testNew();
//	return 0;

    string str = "http://c.linzeyu.net";

    try 
    {
       // char ch1 = str[1000000000];	// 这里该挂的还是会挂, 因为不是at
       // cout << ch1 << endl;
    }
    catch (exception e) 
    {
        cout << "[1]out of bound!" << endl;
    }
	
    try 
    {
//	int a = 12;
//	int b = a / 0;
        char ch2 = str.at(1000000000);	// at 会检查异常
        cout << ch2 << endl;
    }
    catch (exception& e) 
    {  //exception类位于头文件中
        cout << "[2]out of bound!" << endl;
    }
 //   char ch3 = str.at(100000000);	// terminate called after throwing an instance of 'std::out_of_range' ,
					// 这里会抛异常, 但是没有try 去捕获,仍然挂
    return 0;
}

c++ try cathch  其实就是if else  goto

你可能感兴趣的:(c++,开发语言)