我目前正在升级工作中的项目并遇到了这个问题。
如果没有足够的空间来容纳更多对象,则此代码用于抛出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'
我已经阅读了不少帖子,但他们使用不同的方法来访问这个私人会员。我想知道是否有一个解决方法来抛出此异常,我可以抛出一个不同的异常,或者访问这个私有类成员的奇特方式。
答案 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();