问题标签 [setjmp]
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.
c++ - 通过引用捕获的 C++11 lambdas 可轻易破坏
我想知道以下是否泄漏内存(由标准指定)
这归结为通过引用捕获的lambdas是否有一个微不足道的析构函数(我猜)?
我知道这可能是邪恶的,但仍然必须这样做。
multithreading - 在单线程 MPI 应用程序中使用 setjmp 和 longjmp
我已经阅读了其他用户发布的关于多线程应用程序中的 setjmp 和 longjmp 的其他问题。人们说在多线程中使用这两个可能不安全。
那么在我只有主线程的单线程 MPI 应用程序中使用 setjmp 和 longjmp 是否安全?
我问这个是因为我知道 MPI 运行时会创建一些其他与实现相关的线程,这些线程与我的 main() 线程一起运行,所以我不确定这是否会影响我的 MPI 应用程序中 setjmp 和 longjmp 的使用。
c - 未修改的本地人的地址会在 setjmp/longjmp 中损坏吗?
如果一个人最终陷入使用 setjmp/longjmp (don't ask)卡住的情况,那么编译器会发出很多很好的警告,说明你什么时候做错了。
但是在 Clang 中-Wall -Wextra -pedantic
使用Address Sanitizer进行构建时,我得到了一个大致平行于以下内容的案例:
在 longjmp 上,查看helper
堆栈帧时,错误指针为空。如果我查看outer()
框架,它会说错误已“优化”。
这很令人费解,因为我正在编译-O0
所以“优化出来”的说法很奇怪。但是与longjmp-y的大多数事情一样,我想知道是什么让编译器无法决定它将提前将错误地址放入哪个寄存器......然后让它失效。
地址消毒剂是在打我吗,还是我实际上必须写如下内容:
当我对此进行研究时,我注意到jmp_buf
在我看到的任何示例中 s 都不是本地人。那是你不能做的事情吗?:-/
注意:有关构造的“语言律师”问题,请参阅下面的@AnT 的回答和评论setjmp() ? ... : ...
。但我实际上在这里发生的事情原来是函数退出后的一个损坏的 longjmp 调用。根据longjmp()
文档(也:常识),这绝对是错误的;我只是没有意识到这就是发生的事情:
如果调用 setjmp 的函数已退出,则行为未定义(换句话说,只允许长跳转调用堆栈)
c - 在多线程环境中捕获信号
我有一个需要尽可能弹性的大型程序,并且有大量线程。我需要捕获所有信号SIGBUS
SIGSEGV
,并在必要时重新初始化问题线程,或者禁用线程以继续减少功能。
我的第一个想法是做一个setjump
,然后设置信号处理程序,可以记录问题,然后做一个longjump
回到线程中的恢复点。存在一个问题,即信号处理程序需要确定信号来自哪个线程,以使用适当的跳转缓冲区,因为跳转回错误的线程是没有用的。
有谁知道如何确定信号处理程序中的违规线程?
r - 当遇到异常情况时,R 扩展可以安全地分配内存吗?
我即将在 C++ 中为 R 编写一个扩展包,并且想知道如何使用动态内存管理而不会有内存泄漏的风险。我读过了
- http://cran.r-project.org/doc/manuals/R-exts.html#Memory-allocation
- http://cran.r-project.org/doc/manuals/R-exts.html#Garbage-Collection
并立即提出三个问题:
在出现 R 异常的情况下,R 是否会优雅地展开 C++ 堆栈帧,例如当
R_alloc
内存不足或Rf_error
由于某些其他情况而被调用时?– 否则,我应该如何清理已经R_alloc
'ed 和PROTECT
ed 或只是Calloc
'ed 的内存?例如,将保证调用析构函数
~ClassA
fora
andR_Free
forbuffer1
andbuffer2
? 如果不是,那么保证这一点的 R 教科书方法是什么?- 可以使用标准 C++(现在已弃用)
std::auto_ptr
或现代C++std::unique_ptr
来简化内存分配习惯吗? - 是否有经过验证的 C++ 习惯用法/最佳实践在 C++ 标准模板库中使用 R 的内存分配,例如一些合适的分配器模板,以便 STL 类从 R 堆分配内存?
ctypes - 如何在 Python 中使用 setjmp/longjmp 编写我的以下 C 代码?
我想知道是否可以在 Python 中实现 setjmp/longjmp?如果没有,是否有任何等效的替代方案?
c++ - C++ 异常和 setjmp/longjmp 的代价
我编写了一个测试来测量线程中 C++ 异常的成本。
这是我最初为了好玩而编写的 C 版本。
与 C 版本相比,C++ 版本的运行速度非常慢。
所以我运行了 callgrind 分析器。
因为cpp-test
,__cxz_throw
被调用了 400,000 次,自身成本为 8,000,032。
因为c-test
,__longjmp_chk
被调用了 400,000 次,自身成本为 5,600,000。
的总成本cpp-test
为 4,048,441,756。
的总成本c-test
为 60,417,722。
我想不仅仅是简单地保存跳转点的状态并稍后恢复是通过 C++ 异常完成的。我无法使用更大N
的测试,因为 callgrind 分析器将永远运行以进行 C++ 测试。
C++ 异常所涉及的额外成本是多少,至少在这个例子中它比setjmp
/对慢很多倍?longjmp
c - 限制c中函数的执行时间
我想在不停止整个程序的情况下限制纯 C 中函数的执行。
我相信 stackoverflow.com 上与此最接近的是该线程的最后一条评论:如何限制 C/POSIX 中函数的执行时间?
有人说在函数之后使用 setjmp 和 longjm 来限制时间,但是线程死了。
有没有人知道这是否真的可能?
干杯
c - glibc 的 setjmp 代码在哪里?
setjmp
我对至少在 x86_64 linux中究竟做了什么感兴趣,所以我搜索了glibc
的源代码,但我无法真正找到寄存器保存的完成位置。你能解释一下这里发生了什么吗?
设置jmp.h
bsd-_setjmp.c
设置jmp.c
sigjmp.c
c - 在调用 va_end 之前可以 longjmp 吗?
在本问答中,您应该始终致电va_end()
:
但是如果在你到达 va_end 之前有一段代码 longjmp 呢?va_end 是否有任何保证会好起来的承诺?或者从概念上讲,它(例如)可能会进行内存分配va_start()
,而不是仅使用堆栈技巧?