我正在开发一个C ++测试程序。环境不提供异常支持,我需要知道在使用new
时是否有足够的空间。我使用new(std::nothrow)
看过有关它的帖子,但我想问你以下内容:
想象一下,我们有一段调用new (std::nothrow)
的代码,结果是它可以分配对象并调用构造函数,但是在构造函数中还有另一个new
无法分配。
我怎么可能知道对象是否已经正确初始化?(在调用实例之前,请不要回答像标志一样的问题)
反正有没有从构造函数返回NULL
?
答案 0 :(得分:2)
不,您无法从构造函数返回值。
抛出异常是发出构造函数失败的唯一理智方式。如果没有例外,最好的做法是避免可能失败的完全构造函数。将所有非平凡的初始化移至专用的Init
成员函数。
注意这意味着不会复制任何分配资源的东西。禁用此类中的所有复制构造函数和复制赋值运算符。
答案 1 :(得分:1)
我要说你必须给你的班级某种bool is_valid()
成员并在构建后给它打电话。
在构造对象时,如果你真的需要动态内存,也许会重新考虑。也许只是简化构造函数并为您的类提供某种bool initialize()
在调用实例之前,请不要像检查标志那样回答smth
对不起,确实读得太晚了。但是你要求构造函数返回一个值。你知道的是不可能的......
还有标记和错误代码的替代方法:
std::exit, std::abort, std::terminate
但我想你也不想要这个。
我也忘记了assert()
,它也没有“返回”任何内容
答案 2 :(得分:0)
即使有内存,我也需要执行代码。那么如果没有内存,你想要构造函数做什么?您可以将类更改为始终构造为有效状态,即使这不是您最终想要的状态类型。
struct foo
{
size_t size=0; // default state is empty
bar*data=nullptr; // default state has no data allocated
int resize(size_t new_size)
{
if(new_size == size) return 0;
delete[] data;
data = new bar[new_size];
size = data? new_size : 0;
return data? 0 : error_code;
}
};
请注意隐式默认构造函数。