有一些关于从构造函数抛出并抛出DLL边界的问题,但我找不到能够解决这种特定情况的问题。
我读过两件事:
如果发生错误,构造函数应抛出异常。这可确保对象不会处于僵尸状态,无需使用函数来检查对象的状态,并强制执行RAII。所有好事。
我们不应该跨越DLL边界。堆内存不共享,可能会发生不好的事情。这个细节让我有点懊恼,但到处都是一般建议不要这样做,所以我不会。这里的异常(!)是所有代码都使用相同的编译器编译的,但即使这似乎是编译器特定的,因此也不可靠。错误代码!
现在我的问题:
如何安全地创建在DLL中某处定义的类的实例?
我认为可能唯一安全的方法是让DLL中的所有(导出)构造函数不会抛出异常,或者可能提供导出的自由函数,这些函数返回指向对象的指针,如果该对象可能为NULL抓住了一个例外。
任何人都可以提出更合适的建议,或者告诉我,我的错误结束了吗?
答案 0 :(得分:1)
我认为你的方法是正确的。让我们为对象导出工厂而不是对象本身。
顺便说一句,它可以被投影,这样你的每个DLL都可以有一个同名的导出函数。因此,在该导出函数中,您可以使用if-else块来枚举DLL的所有工厂并尝试构造所请求的对象。 (比如说,对象用名称,名称crc32,名称哈希等标识)
我认为这可能是几种方法。 例如,您可以在DLLMain / Attach事件上的公共对象上注册每个DLL工厂而不是公共导出函数,或者处理自定义DLLMain事件 - 这样您就可以将Neo对象地址设置为DLLMain的一个参数,并为每个DLL注册其上的确切工厂。
但常见的事情是当你的对象可以在ctor / init方法上抛出一个假设时使用工厂。