构造函数和高级异常抛出C ++

时间:2017-12-07 13:08:48

标签: c++ exception constructor throw

我必须分析这个涉及异常的C ++代码,但我不习惯分析应该做什么代码。关于它的一些事情我不明白。另外,我没有缓冲数据结构的经验或在C ++中抛出异常的高级细节。

数据结构的最大大小是多少?

  • 也就是说,如果Seq_Buffer的大小为= 100,那么多少 元素可以存储吗?
  • 我的直觉告诉我,如果你创造了100号的东西, 它的最大尺寸为100,但我无法确定事实。

构造函数可以在c ++中抛出异常吗?

  • Seq_Buffer的构造函数可以抛出异常吗?
  • 假设这是真的,为什么这样做没有解释 说尝试,抓住或抛出障碍?我认为这是获得例外的唯一途径

我试过寻找这两个问题,但我真的很失落。感谢您抽出宝贵时间阅读。我尝试过搜索这两个问题,但我真的很失落。感谢您抽出宝贵时间阅读。

Seq_Buffer类及其构造函数的代码如下:

var count = await slides.length;

console.log("[DEBUG] found " + count + " elements");

for(var i = 0; i < count; i++)
{
    var txtOfCurrElem = await slides.nth(i).innerText; 
    console.log("[DEBUG "+ i +"] Text: " + txtOfCurrElem);
}

1 个答案:

答案 0 :(得分:1)

是的,我们可以从构造函数中抛出异常。这是处理构造函数失败或类初始化错误的最佳方法。参考此代码示例

class bar
{
public:
  bar()
  {
    std::cout << "bar() called" << std::endl;
  }

  ~bar()
  {
    std::cout << "~bar() called" << std::endl;

  }
};
class foo
{
public:
  foo()
    : b(new bar())
  {
    std::cout << "foo() called" << std::endl;
    throw "throw something";
  }

  ~foo()
  {
    delete b;
    std::cout << "~foo() called" << std::endl;
  }

private:
  bar *b;
};


int main(void)
{
  try {
    std::cout << "heap: new foo" << std::endl;
    foo *f = new foo();
  } catch (const char *e) {
    std::cout << "heap exception: " << e << std::endl;
  }

  try {
    std::cout << "stack: foo" << std::endl;
    foo f;
  } catch (const char *e) {
    std::cout << "stack exception: " << e << std::endl;
  }

  return 0;
}

这里你从构造函数本身抛出异常。但是有些情况你在构造函数中分配内存(堆)。在这种情况下,在构造函数中抛出异常并没有多大用处,因为这会导致内存泄漏。因为如果类初始化失败,那么就没有为该类调用析构函数,因为已经抛出异常(假设在析构函数中使用free释放分配的内存)。所以在构造函数中抛出异常取决于场景或使用case.Not每种情况都不会在构造函数中抛出异常。