C++Primer18.1.1节练习

文章讨论了C++中的异常处理,包括range_error和exception。当在new后delete前发生异常时可能导致内存泄漏。两种解决方法提出:一是使用自定义类封装资源分配并在析构函数中删除内存;二是使用try-catch块确保在异常发生后能释放内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习18.1:

(a):range_error

(b):exception

抛出异常所在的地址,后续catch处理可对其进行解引用

练习18.2:

在new创建内存之后,delete释放之前发生异常,new创建的内存不能被释放,发生内存泄漏

练习18.3:

第一种:将资源的分配封装成一个类,在析构函数中delete动态内存

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

class SourceManager {
public:
	SourceManager(size_t sz) :p(new int[sz]) { }
	~SourceManager()
	{
		if (p != nullptr)
		{
			delete p;
		}
	}

private:
	int* p;
};


void exercise(int* b, int* e)
{
	vector<int> v(b, e);
	//int* p = new int[v.size()];
	//替换成类管理
	SourceManager(v.size());
	ifstream in("ints");
	//发生异常,调用析构
}

第二种:定义try语句块

void exercise(int* b, int* e)
{
	vector<int> v(b, e);
	int* p = new int[v.size()];
	try {
		ifstream in("ints");
	}

	catch(...) {
		delete p;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学C++.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值