关于从构造函数中抛出和跨越DLL边界抛出一些问题,但是我找不到一个能回答这种特定情况的问题。
我读过两件事:
如果发生不好的情况,构造函数应抛出异常。这样可以确保对象不处于僵尸状态,无需使用函数来检查对象的状态并强制执行RAII。一切美好的事物。
我们不应该跨越DLL边界。不会共享堆内存,并且可能发生不好的事情。这个细节让我有些逃脱,但是到处都是一般性的建议,不要这样做,所以我不会。这里的例外(!)是所有代码都使用同一编译器编译时,但即使如此,这似乎也是特定于编译器的,因此并不可靠。错误代码是!
现在我的问题是:
如何安全地创建在DLL中某个位置定义的类的实例?
我认为,执行此操作的唯一安全方法是使DLL中的所有(导出的)构造函数都保证不会抛出异常,或者提供导出的自由函数,这些函数返回指向对象的指针,如果存在异常,则该指针可能为NULL捕捉。
谁能提出更合适的建议,或者告诉我我坚持不对?
我认为您的方法是正确的。让我们导出对象的工厂,而不是对象本身。
顺便说一句,可以对其进行投影,以便对于每个DLL,您都可以具有相同名称的导出功能。因此,在该导出函数中,您可能拥有if-else块,该块枚举了DLL的所有工厂,并尝试构造所请求的对象。(假设对象是通过名称,名称的crc32,名称的哈希等标识的)
我认为这可能是几种方法。例如,可以使用在DLLMain / Attach事件中的公共对象上注册每个DLL工厂的方法,或者处理一个自定义的DLLMain事件(而不是您自己的事件),而不是使用公共导出函数,以便可以将Neo对象地址作为DLLMain的参数。并为每个DLL在其上注册确切的工厂。
但是常见的事情是当对象可能对ctor / init方法产生期望时使用工厂。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句