137得票4回答
Gnu Assembler(GAS)中的CFI指令用于什么?

每行似乎都有一个.CFI指令,并且这些指令有很多种,例如.cfi_startproc,.cfi_endproc等。 在这里了解更多。 .file "temp.c" .text .globl main .type main, @function ...

66得票6回答
为什么在异常情况下析构函数不会被调用?

我本来期望在这个程序中 A::~A() 会被调用,但现在没有被调用:#include <iostream> struct A { ~A() { std::cout << "~A()" << std::endl; } }; void f() { A...

24得票3回答
Rust如何知道在堆栈展开期间何时运行析构函数?

mem::uninitialized的文档指出,使用该函数是危险/不安全的原因:对未初始化的内存调用drop是未定义的行为。 因此,我认为这段代码应该是未定义的: let a: TypeWithDrop = unsafe { mem::uninitialized() }; panic!("...

15得票4回答
如何在 SIGSEGV 上使用 _Unwind_Backtrace 获取完整的堆栈跟踪

我通过以下代码处理SIGSEGV:int C() { int *i = NULL; *i = 10; // Crash there } int B() { return C(); } int A() { return B(); } int main(void) { ...

15得票2回答
x64和x32中堆栈展开的行为不同。

在下面的场景中,为什么使用相同的代码时,在x64中堆栈空间会增加而在x32中会减少? 背景: 我们的客户可以使用一个领域语言编写脚本,该语言在运行时使用递归技术进行解释,并在Web服务器上执行。他们可能会在脚本中犯错误,导致异常抛出,这个异常被捕获并记录。 由于这种递归技术,我们通过检查...

15得票2回答
从C FFI调用Rust时如何避免panic,而不需要创建线程

我正在为Duktape JavaScript解释器编写Rust包装器(https://github.com/emk/duktape-rs)。在正常使用情况下,调用堆栈将如下所示: Rust:任意应用程序代码。 Rust:我的库包装器。 C:Duktape解释器。 Rust:我的Rust代码。...

14得票2回答
C/C++实现中longjmp会取消哪些操作?

是否存在主要的C/C++实现,其中longjmp函数“展开”,即与自动存储对象的析构函数、__attribute__((__cleanup__(...)))、POSIX线程取消处理程序等相互作用,而不仅仅是恢复由setjmp保存的寄存器上下文?我特别关注具有此属性的POSIX实现(或非POSI...

11得票2回答
在执行另一个析构函数期间,有没有什么技巧可以检测到对象是否被创建?

这有点是对为什么Alexandrescu不能使用std::uncaught_exception()来实现ScopeGuard11中的SCOPE_FAIL?的跟进。 我想检测是否有人在另一个类的析构函数中(或在调用堆栈的某个活动析构函数中)创建MyClass。class MyClass { p...

11得票4回答
Java和C++中的堆栈展开问题

据我所知,在出现未捕获的异常时,C++会立即销毁局部变量,而Java则释放引用并将其余部分留给垃圾收集器。 这是正确的吗?换句话说,Java和C++在此问题上的区别具体在哪里?哪种语言在堆栈展开问题方面被认为更好呢? :)

10得票4回答
PHP类构造函数中的作用域展开

我正在学习 PHP 类和异常,而且由于我的 C++ 背景,以下内容让我感到奇怪: 当派生类的构造函数抛出异常时,似乎基类的析构函数不会自动运行:class Base { public function __construct() { print("Base const.\n"); } ...