跨DLL边界的构造方法抛出异常

安迪克

关于从构造函数中抛出和跨越DLL边界抛出一些问题,但是我找不到一个能回答这种特定情况的问题。

我读过两件事:

  1. 如果发生不好的情况,构造函数应抛出异常。这样可以确保对象不处于僵尸状态,无需使用函数来检查对象的状态并强制执行RAII。一切美好的事物。

  2. 我们不应该跨越DLL边界。不会共享堆内存,并且可能发生不好的事情。这个细节让我有些逃脱,但是到处都是一般性的建议,不要这样做,所以我不会。这里的例外(!)是所有代码都使用同一编译器编译时,但即使如此,这似乎也是特定于编译器的,因此并不可靠。错误代码是!

现在我的问题是:

如何安全地创建在DLL中某个位置定义的类的实例?

我认为,执行此操作的唯一安全方法是使DLL中的所有(导出的)构造函数都保证不会抛出异常,或者提供导出的自由函数,这些函数返回指向对象的指针,如果存在异常,则该指针可能为NULL捕捉。

谁能提出更合适的建议,或者告诉我我坚持不对?

亚历山大·埃纳尔迪耶夫(Alexander Enaldiev)

我认为您的方法是正确的。让我们导出对象的工厂,而不是对象本身。

顺便说一句,可以对其进行投影,以便对于每个DLL,您都可以具有相同名称的导出功能。因此,在该导出函数中,您可能拥有if-else块,该块枚举了DLL的所有工厂,并尝试构造所请求的对象。(假设对象是通过名称,名称的crc32,名称的哈希等标识的)

我认为这可能是几种方法。例如,可以使用在DLLMain / Attach事件中的公共对象上注册每个DLL工厂的方法,或者处理一个自定义的DLLMain事件(而不是您自己的事件),而不是使用公共导出函数,以便可以将Neo对象地址作为DLLMain的参数。并为每个DLL在其上注册确切的工厂。

但是常见的事情是当对象可能对ctor / init方法产生期望时使用工厂。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: regex构造抛出异常

来自分类Dev

跨DLL边界的向量的内存重定位

来自分类Dev

如果其DataContext类构造函数抛出异常,则不显示窗口的最佳方法

来自分类Dev

如果其DataContext类构造函数抛出异常,则不显示窗口的最佳方法

来自分类Dev

如何处理跨执行边界的libstdc ++引发异常

来自分类Dev

std :: uncaught_exception无法跨DLL边界工作

来自分类Dev

如何跨DLL边界使用Boost.Log?

来自分类Dev

如何跨DLL边界使用Boost.Log?

来自分类Dev

方法中的抛出异常方法

来自分类Dev

在spring中创建bean时出错,构造方法抛出异常;嵌套的异常是java.lang.NullPointerException

来自分类Dev

Arraylist addAll()方法抛出异常

来自分类Dev

抛出异常的方法的 JUnit 测试

来自分类Dev

模拟方法不抛出异常

来自分类Dev

忽略边界异常JAVA的简单方法

来自分类Dev

查看传递给抛出异常的构造函数的字符串

来自分类Dev

捕获构造函数抛出的异常似乎是不可能的

来自分类Dev

如果检测到构造不良的树,将抛出什么异常?

来自分类Dev

Java在超级属性的子构造函数中抛出异常

来自分类Dev

ReadProcessMemory 跨模块边界

来自分类Dev

强制所有方法抛出异常

来自分类Dev

将异常抛出到方法之外-Java

来自分类Dev

枚举静态方法抛出空指针异常

来自分类Dev

HttpWebRequest.GetResponse方法抛出404异常

来自分类Dev

WebAPI POST方法抛出空异常

来自分类Dev

与反应堆抛出异常的正确方法

来自分类Dev

以Span为参数抛出异常的测试方法

来自分类Dev

Java中pop()方法的抛出异常

来自分类Dev

通常,如果方法抛出大量异常?

来自分类Dev

未捕获的SerialPort关闭方法抛出异常

Related 相关文章

热门标签

归档