【发布时间】:2018-01-03 18:54:24
【问题描述】:
我曾经通过构造函数使用initialization list,一切顺利。但是现在我需要一些exception handling 在我的课堂上。
下面是一些示例代码:
1- 没有异常处理
class CVector{
public:
CVector(const int);
protected:
int* pInt;
int size;
};
CVector::CVector(const int sz) :
pInt{ new int[sz]}, size{ sz}{
}
上面的构造函数不会检查是否传递了无效的大小,或者new失败了...
现在我编辑了构造函数来处理异常:
2- 异常处理:
CVector::CVector(const int sz){
size = sz;
if(size <=0 )
throw; // some exception object
pInt = new int[sz];
if(nullptr == pInt)
throw; // some memory exception
}
- 现在的问题:它们是专有的吗? - 我的意思是如何通过构造函数将异常处理与初始化列表混合在一起?
【问题讨论】:
-
new不能返回nullptr,除非您使用指定 nothrow。它在分配失败时抛出std::bad_alloc。 -
我不认为这个问题真的与指定的欺骗重复。当不使用智能指针时,它实际上是关于安全资源管理的。 (提示:使用智能指针)。
-
@RichardHodges 谢谢你的提示。请添加答案。
-
@RichardHodges:真不知道为什么这么快就关门了?
-
通常,您会使用
std::vector并避免所有这些问题。但是,由于您似乎正在尝试实现自己的向量(也许作为学习练习?),那么您可以改用std::unique_ptr<int[]>。在任何情况下,您都应该依赖RAII,而不是尝试捕获异常并手动清理。如果一个类是特定且独特的工作,则只能手动执行此操作。
标签: c++ exception-handling stdinitializerlist