【发布时间】:2018-07-06 08:35:43
【问题描述】:
我正在编写一个混合使用 c 和 c++ 的程序,我遇到了一个关于 c++ 异常处理程序中的对象销毁的问题。我写了一个简单的案例来重现问题。
main.cpp
#include <iostream>
extern "C" void test(void(*f)(void));
struct foo {
~foo() {
std::cout << "foo destruction" << std::endl;
}
};
void error_handler(void) {
throw 1;
}
int main() {
try {
foo f;
test(error_handler);
} catch (...) {
}
}
test.c
void test(void(*handler)(void)) {
handler();
}
当我在 Visual Studio 2015 和 Visual Studio 2017 中构建它时,foo 的析构函数未被调用。但是当我使用 gcc 5.4 对其进行测试时,foo 的析构函数工作正常。
是否可以通过调用函数指针(指向cpp代码中实现的函数的指针)在C代码中抛出C++异常?上面的代码是非法的还是只是一个 msvc 错误?
【问题讨论】:
-
简单的回答:没有。
-
问题是 Visual Studio 并没有在最后停止程序。如果你使用代码块,你会看到析构函数的输出。
-
这将要求抛出的异常通过 C 代码并返回到 C++。当然,C 标准对此只字未提。
-
@Matthias 这不是原因。断点也没有被击中。
-
用
/EHa编译。
标签: c++ gcc visual-c++