C ++构造函数返回嵌入式系统

时间:2017-05-24 09:20:50

标签: c++ constructor null

我正在开发一个C ++测试程序。环境不提供异常支持,我需要知道在使用new时是否有足够的空间。我使用new(std::nothrow)看过有关它的帖子,但我想问你以下内容:

想象一下,我们有一段调用new (std::nothrow)的代码,结果是它可以分配对象并调用构造函数,但是在构造函数中还有另一个new无法分配。

我怎么可能知道对象是否已经正确初始化?(在调用实例之前,请不要回答像标志一样的问题) 反正有没有从构造函数返回NULL

3 个答案:

答案 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;
  }
};

请注意隐式默认构造函数。