【问题标题】:_THROW_NCEE (std::bad_alloc, NULL) --- C++11_THROW_NCEE (std::bad_alloc, NULL) --- C++11
【发布时间】:2014-06-25 19:50:46
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 如果不知道宏 _THROW_NCEE 的作用,就无法回答这个问题。你代码中的每一个标识符都是reserved by for your standard library implementation
  • #define _THROW_NCEE(x, y) throw x(y) 这是 _THROW_NCEE 的定义...我发现其他人问过它,它一定是执行此任务的流行方式。
  • 更具体地说,至少在 MSVC 2010 中,_THROW_NCEE(x, y) 定义在 &lt;xstddef&gt; 中;如果定义了_HAS_EXCEPTIONS_,则为throw x(y),否则为x(y)._Raise()。目前无法查看任何更新的版本。

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


【解决方案1】:

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

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

【讨论】:

  • 这是我“研究”最多的帖子。我只是不确定 throw std::bad_alloc() 是否可以替代它,我不确定 _THROW_NCEE。然而,这行得通!非常感谢您的帮助!
  • @user3662475 由于std::bad_alloc只能默认构造或复制构造,所以除了throw std::bad_alloc()之外,没有其他方法可以抛出它!要检查的另一件事是_THROW_NCEE(a, b) 真的只扩展为throw a(b),但你已经检查过了,所以你应该没问题。有可能在以前_THROW_NCEE 被用来使 throws 成为可选,从而支持无异常编译。
【解决方案2】:

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

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多