Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接到C+时在C中使用setjmp和longjmp+;图书馆 我想在C程序中使用SETJMP和LangJMP,它链接到一个在C++中实现的库(但是有一个C API)。 < > C++代码确实执行动态内存分配,指针通过API,但是只要代码的C端正确地管理那些(不透明)对象,使用LojMP时就不应该有任何混乱,对吗? 我知道在C++代码中使用这些函数是不安全的,但是在C代码中与C++代码链接是否安全?< P>你从C代码中调用C++函数的事实并没有使SETJMP和LoJMP比它们更不安全。_C++_C_Setjmp - Fatal编程技术网

链接到C+时在C中使用setjmp和longjmp+;图书馆 我想在C程序中使用SETJMP和LangJMP,它链接到一个在C++中实现的库(但是有一个C API)。 < > C++代码确实执行动态内存分配,指针通过API,但是只要代码的C端正确地管理那些(不透明)对象,使用LojMP时就不应该有任何混乱,对吗? 我知道在C++代码中使用这些函数是不安全的,但是在C代码中与C++代码链接是否安全?< P>你从C代码中调用C++函数的事实并没有使SETJMP和LoJMP比它们更不安全。

链接到C+时在C中使用setjmp和longjmp+;图书馆 我想在C程序中使用SETJMP和LangJMP,它链接到一个在C++中实现的库(但是有一个C API)。 < > C++代码确实执行动态内存分配,指针通过API,但是只要代码的C端正确地管理那些(不透明)对象,使用LojMP时就不应该有任何混乱,对吗? 我知道在C++代码中使用这些函数是不安全的,但是在C代码中与C++代码链接是否安全?< P>你从C代码中调用C++函数的事实并没有使SETJMP和LoJMP比它们更不安全。,c++,c,setjmp,C++,C,Setjmp,重要的是,如果您的库分配了资源,则必须准备好恢复代码,以确保在调用longjmp后正确释放这些资源。虽然这很可能是您自己分配的,但是C++库依赖C++如何使用C接口是困难的或不可能的。它们有效地复制了异常的行为,但没有正确地展开堆栈(例如,它们不会对强制退出的堆栈帧上的对象运行析构函数)。在可能的情况下,如果您有异常,请使用异常。好吧,正确与否longjmp通常不会调用析构函数,因此在如下代码中使用它: void f(jmp_buf jb) { some_cpp_object_with_a_

重要的是,如果您的库分配了资源,则必须准备好恢复代码,以确保在调用longjmp后正确释放这些资源。虽然这很可能是您自己分配的,但是C++库依赖C++如何使用C接口是困难的或不可能的。它们有效地复制了异常的行为,但没有正确地展开堆栈(例如,它们不会对强制退出的堆栈帧上的对象运行析构函数)。在可能的情况下,如果您有异常,请使用异常。

好吧,正确与否
longjmp
通常不会调用析构函数,因此在如下代码中使用它:

void f(jmp_buf jb)
{
  some_cpp_object_with_a_nontrivial_destructor x;
  if (some_condition) longjmp(jb, 2);
  // some other code
}

会让各种不好的事情发生。如果你避免这种情况,你应该没事。(一般来说,LojJMP不能跳过任何具有非平凡析构函数的对象的活动堆栈帧)。

OP在C++中不试图使用<代码> SETJMP < /C> >/Cudio> LojMP(/Cord>),而是使用C接口的一些C++代码(它可能将所有C++ +的ISM屏蔽成可调用的C代码,并且安全地使用)。.即使如此,这也要视情况而定。在您自己的代码中跳转可能是安全的,但是使用
longjmp
退出回调(例如)可能会造成严重破坏。使用
longjmp
退出回调(除非明确授予这样做的权限)听起来是个坏主意,无论使用何种语言。在C语言中,你也必须自己清理干净。@Dashwuff好的,在回调中使用它是危险的,但如果我没有混合语言,情况就是这样。除此之外,还有其他情况让你说“这取决于”?我的代码是C,所以我不能用一个有构造函数的类型定义局部变量。因此,您的示例不适用于我的问题。如果您给C++函数回调,那么回调就调用了一个非常类似的场景,回调调用LangJMP.OK。我的想法是,只要C++库中的分配有一个方法,通过适当的C接口调用,C++代码就与龙JMP的效果隔离,异常处理和LoJMP不能相互干扰。(我也是C++库的实现者)如果在C++库中有异常处理,你应该确保任何抛出的异常都被捕获在库中,你不希望异常从C++代码中出来(不确定如果你这样做会发生什么,从来没有尝试过)。为了释放C++的分配,你必须找出在龙JMP调用之后需要控制的C代码需要释放什么。因为你拥有这个应用程序和库,所以我看不出有任何问题可以解决这个问题。