有一些有关在构造函数中抛出异常以及跨DLL边界抛出异常的问题,但我找不到回答这个具体情况的答案。
我读过的两件事情是:
1. 如果发生错误,构造函数应该抛出异常。这可以确保对象不处于僵尸状态,消除了函数检查对象状态的需要,并实施了RAII。所有这些都是好事情。
2. 我们不应该跨DLL边界抛出异常。堆内存不共享,可能会发生糟糕的事情。这方面的细节逃脱了我一些,但是普遍建议是不要这么做,所以我也不会这样做。唯一的例外是,当所有代码都使用相同的编译器编译时,但即使如此,这似乎也是与编译器相关的,因此不可靠。错误代码就是了!
现在我的问题是:
如何安全地创建一个定义在DLL中的类的实例?
我认为也许唯一安全的方法是让DLL中的所有(导出)构造函数承诺不抛出异常,或者提供导出的自由函数,返回指向一个对象的指针,如果捕获到异常则该指针可以是NULL。
有人能提出更合适的建议吗?还是告诉我我弄错了?
我读过的两件事情是:
1. 如果发生错误,构造函数应该抛出异常。这可以确保对象不处于僵尸状态,消除了函数检查对象状态的需要,并实施了RAII。所有这些都是好事情。
2. 我们不应该跨DLL边界抛出异常。堆内存不共享,可能会发生糟糕的事情。这方面的细节逃脱了我一些,但是普遍建议是不要这么做,所以我也不会这样做。唯一的例外是,当所有代码都使用相同的编译器编译时,但即使如此,这似乎也是与编译器相关的,因此不可靠。错误代码就是了!
现在我的问题是:
如何安全地创建一个定义在DLL中的类的实例?
我认为也许唯一安全的方法是让DLL中的所有(导出)构造函数承诺不抛出异常,或者提供导出的自由函数,返回指向一个对象的指针,如果捕获到异常则该指针可以是NULL。
有人能提出更合适的建议吗?还是告诉我我弄错了?