问题标签 [nothrow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
193 浏览

c++ - 如何为析构函数指定 nothrow 异常说明符?

我试图指定一个函数是nothrow每当析构函数Foo不抛出时。我可以通过使用类型 trait 来做到这一点std::is_nothrow_destructible<>。我怎样才能直接做到这一点?我尝试了以下方法,但如果我取消注释注释行,它不会编译

我收到一个错误

错误说明符noexcept(noexcept(~Foo()))不正确,尽管对于构造函数我可以使用noexcept(noexcept(Foo())). 我在这里遗漏了一些明显的语法吗?

0 投票
1 回答
1184 浏览

c++ - 在 Linux 上的 C++ 中的内存分配新(nothrow)失败时该怎么办

在没有例外的情况下,我看到几个帖子说

例如

如何使用 new 运算符检查内存分配失败?

如果我的 C++“新”内存分配失败,如何找出返回值?

我相信这是他们从 C++ 标准中得到的声明,如引用:

如果分配函数声明为不抛出异常规范,则返回 null 以指示分配存储失败,否则返回非空指针。

然而,赫伯萨特 http://www.gotw.ca/publications/mill16.htm

linux会过度使用内存,这不符合c++标准。即,检查 null 与 linux 系统无关。“new”要么成功,要么失败,进程被 linux 杀死。

所以,我们能做些什么?似乎没有办法检查故障。

[更新] 关于 linux overcommit:overcommit_memory

0 — 默认设置。内核通过估计可用内存量和明显无效的失败请求来执行启发式内存过度使用处理。不幸的是,由于内存是使用启发式而不是精确算法分配的,因此此设置有时会导致系统上的可用内存过载。

0 投票
2 回答
92 浏览

c++ - C++ Memory allocation with operator new:检测和处理分配错误的方法有哪些?

在以前的程序中,我使用以下代码来检查内存分配失败,通常没有考虑替代方案:

此方法也记录在此处

我在这里找到了语法的参考:

这表明如果程序员没有nothrow在 new 中包含“参数”,那么检查nullptr是无效的?这个对吗?还是它依赖于操作系统?

据我了解,除非由于与此相关的开销,您实际上可以从中恢复,否则放入new一个块没有什么意义。try-catch这也是正确的吗?

0 投票
1 回答
261 浏览

c++ - operator++() nothrow 无法编译

为什么我不能让 operator++() 不抛出?

这可能是使用后缀 ++ 运算符(优于前缀 ++ 运算符)的少数优势之一。

例如,此代码无法编译

附带说明一下,后缀运算符也可以是线程安全的。

0 投票
2 回答
1450 浏览

c++ - 使用未声明的标识符“nothrow”;您指的是 'throw' 吗? 记忆

我正在使用 cpp 代码将一个应用程序从 Windows 移植到 Mac。在 Xcode 中构建应用程序时,它会抛出错误:

这些错误在 cpp 标准库头文件中抛出。

以下是错误堆栈说明:

我在互联网上搜索但无法找到解决此问题的方法。任何建议都会有所帮助。为什么从系统头文件中抛出错误?

系统详情:

  • SDK 是 OSX 10.10。

  • 用于编译应用程序的编译器选项是 C++ 标准库:

    libc++(支持 C++11 的 LLVM C++ 标准。C++ 语言方言:GNU++11。C++ 编译器:Apple LLVM 6.0

0 投票
1 回答
451 浏览

c++ - Linux g++ new (std::nothrow) 确实有效

我在 new 运算符中使用 c++ 常量值 std::nothrow 以避免失败时出现异常,而是返回 null 。但是正如我所尝试的,这似乎不适用于我的环境是 Linux x86_64 上的 g++ 4.4.4。

以下是测试程序和执行结果:

执行结果:

从输出消息来看,抛出了异常;但我希望它不应该,而是期望返回空指针。任何人都可以帮我解决这个问题。谢谢。

0 投票
2 回答
560 浏览

c++ - 为什么 std::pair 不可构造?

以下代码:

编译时产生以下输出g++ -std=c++11

为什么std::pair<string, int>nothrow 不可构造,whileFoo是,为什么它是 nothrow move 可构造的?

0 投票
1 回答
70 浏览

c++ - 为什么`std:variant`的`operator=(T&& t)`的noexcept规范不依赖于内部类型的析构函数的noexcept规范?

长标题:为什么std:variant'soperator=(T&& t)的 noexcept 规范不依赖于内部类型的析构函数的 noexcept 规范?

我可以在cppreference上看到

所以编译:

但它调用FooThrow的析构函数是noexcept(false)

好像不太对。我错过了什么吗?

0 投票
1 回答
1817 浏览

c++ - std::make_shared 和 std::make_unique 有“nothrow”版本吗?

对于 new 运算符,我们有以下std::nothrow版本:

我们对std::make_sharedor有类似的东西std::make_unique吗?

0 投票
1 回答
298 浏览

c++ - new(std::nothrow) int[n] 抛出异常

为什么这段代码会抛出异常?它打印new expression threw std::bad_array_new_length。根据标准,在这种情况下,新表达式应返回 nullptr。

如果 noptr-new-declarator 中的表达式存在,则它被隐式转换为 std::size_t。如果出现以下情况,则该表达式是错误的:

— 表达式是非类类型,并且它在转换为 std::size_t 之前的值小于零;

[...]

如果转换为 std::size_t 后表达式错误:

— 如果表达式是核心常量表达式,则程序格式错误;

— 否则,不调用分配函数;反而

— 如果将被调用的分配函数具有非抛出异常规范 (14.5),则 new-expression 的值是所需结果类型的空指针值;

— 否则,new 表达式通过抛出与 std::bad_array_new_length (17.6.3.2) 类型的处理程序 (14.4) 匹配的类型的异常而终止。

使用 gcc 9.2 编译