gpt4 book ai didi

c++ - 在跨 dll/so 的注入(inject)类中使用异常是否安全?

转载 作者:行者123 更新时间:2023-11-28 08:13:30 25 4
gpt4 key购买 nike

我有一个 dll 或共享对象,MyDll,它生成一个对象,ForeignObject:

class ForeignObject : public LocalInterface {
virtual void some_func(Injector& i) {
i.inject();
}
};

在界面中看起来像这样。

class Injector {
virtual void inject() = 0;
};

class LocalInterface {
virtual void some_func(Injector& i) = 0;
};

然后我执行以下操作:

class MyInjector : public Injector {
virtual void inject() {throw std::runtime_error("arrgghh");}
};

int main() {
LocalInterface* foreign_obj = create_object_from_my_dll();
MyInjector injector;
foreign_obj->some_func(injector);
destroy_object_from_my_dll(foreign_obj);
return 0;
}

我的问题是,为什么抛出这样的异常是安全/不安全的。使用相同的编译器构建它们是否安全?在编译器之间?

最佳答案

我会说答案取决于操作系统。但是对于我使用过的所有 UNICES(包括 Linux 和 Mac OS X)来说,它都是安全的。当然,您需要使用相同 ABI 的编译器进行编译,但是 g++ 的 ABI 多年没有改变(记不清了,但我认为 3.2 是最后一次大的改变)。此外,在 Linux 中使用的模型中,链接不会影响代码行为。因此,您可以安全地将任何代码放入动态链接文件(即共享对象文件)中,它会像静态链接一样工作。

在 Windows 上,如果您使用 VC++,那么您将无法使用其他编译器编译您的库。程序和库必须使用相同版本的VC++,没有任何方向的兼容性。如果您使用的是 g++,则可以使用其他版本的 g++(如在 UNIX 上)进行编译,但不能使用 VC++。至于这个问题,这是危险的,我会让 Windows 专家回答,因为 DLL 有奇怪的行为,如果我记得一个对象应该总是在加载它的 DLL 范围内被销毁,但我不是 100%当然。

关于c++ - 在跨 dll/so 的注入(inject)类中使用异常是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8399415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com