在dll / so中注入类中使用异常是否安全?

时间:2011-12-06 11:48:52

标签: c++ exception-handling shared-libraries

我有一个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;
}

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

2 个答案:

答案 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导出类。您将导出异常,这是一个问题。