我有一个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;
}
我的问题是,为什么 安全/不安全会抛出这样的异常。使用相同的编译器构建它们是否安全?在编译器之间?
答案 0 :(得分:1)
我想说答案取决于操作系统。但是对于我曾经使用过的所有UNICES(包括Linux和Mac OS X),它都是安全的。当然,你需要使用相同的ABI编译编译器,但g ++的ABI几年没有变化(记不清楚,但我认为3.2是最后一次重大变化)。此外,在Linux中使用的模型中,链接不会影响代码行为。因此,您可以安全地将任何代码放入动态链接文件(即共享对象文件)中,它将像静态链接一样工作。
在Windows上,如果使用VC ++,那么您将无法使用其他编译器编译库。程序和库必须使用相同版本的VC ++,在任何一个方向都没有兼容性。如果您使用的是g ++,则可以使用其他版本的g ++(如UNIX)进行编译,但不能使用VC ++进行编译。至于它的问题这是危险的,我会让一个Windows专家的答案作为DLL有奇怪的行为,如果我记得一个对象应该总是在加载它的DLL的范围内销毁,但我不是100%肯定的。
答案 1 :(得分:0)
当且仅当您使用相同的编译器(相同的运行时库)构建它时是安全的,但是如果运行时库不同,它将在程序中生成内存损坏并崩溃。一般来说,异常没有任何特殊问题,但是从dll导出类。您将导出异常,这是一个问题。