_THROW_NCEE(std :: bad_alloc,NULL)--- C ++ 11

时间:2014-06-25 19:50:47

标签: c++ exception visual-studio-2012 c++11

我目前正在升级工作中的项目并遇到了这个问题。

如果没有足够的空间来容纳更多对象,则此代码用于抛出bad_alloc异常:

    ...
else if (((_SIZT)(-1) / _Count) < sizeof (_Ty))
    _THROW_NCEE(std::bad_alloc, NULL);

将此项目升级到vs2012(工具集V110)时出现错误:

error C2248: 'std::bad_alloc': cannot access private member declared in calss 'std::bad_alloc'

我已经阅读了不少帖子,但他们使用不同的方法来访问这个私人会员。我想知道是否有一个解决方法来抛出此异常,我可以抛出一个不同的异常,或者访问这个私有类成员的奇特方式。

2 个答案:

答案 0 :(得分:1)

问题在于_THROW_NCEE宏,它坚持使用指针参数构造异常。作为explained in this answer,从std::bad_alloc构造的const char *从来都不是标准的,并且已在Visual C ++ 2012中删除。

要解决此问题,只需将_THROW_NCEE(std::bad_alloc, NULL)替换为throw std::bad_alloc()

答案 1 :(得分:1)

您的代码失败,因为VS标准库实现为private提供了此(非标准)std::bad_alloc构造函数。这个构造函数在以前的版本中可能不是私有的。

private:
  bad_alloc(const char *_Message) _THROW0()
  : exception(_Message, 1)
  { // construct from message string with no memory allocation
  }

被调用的std::exception构造函数也是非标准的。 VS实现以提供所有这些构造函数而闻名。

exception();
explicit exception(const char * const &);  // non-standard
exception(const char * const &, int);      // non-standard
exception(const exception&);

std::bad_alloc定义的唯一标准构造函数是

bad_alloc() noexcept;
bad_alloc(const bad_alloc&) noexcept;

所以要修复你的代码,替换

_THROW_NCEE(std::bad_alloc, NULL);

throw std::bad_alloc();