|
|
1
10
根据有效C++(第三版)中的Scott Meyers,SydDypTRS在DLL边界上是安全的。共享的_ptr对象从创建它的dll中保留一个指向析构函数的指针。
不过,提姆·莱舍提到了一个有趣的问题 here . 您需要确保在共享指针最终超出作用域之前,不会卸载创建共享指针的dll。我会说,在大多数情况下,这不是你必须注意的,但是如果你创建的DLL是松散耦合的,那么我建议不要使用共享的指针。 另一个潜在的缺点是确保两边都是用兼容版本的Boost库创建的。Boost的共享资源已经稳定了很长一段时间。至少从那时起 1.34 它与TR1兼容。 |
|
|
2
4
在我看来,如果它不在标准中,也不是您的库提供的对象/机制,那么它不应该是到库的接口的一部分。您可以创建自己的对象来进行引用计数,也许在下面使用boost,但不应该在接口中显式地公开它。 |
|
|
3
2
DLL通常不拥有资源-资源由使用DLL的进程拥有。您最好返回一个普通指针,然后将其存储在调用端的共享指针中。但如果没有更多的信息,很难百分之百地确定这一点。 |
|
|
4
2
如果从DLL接口公开原始指针,则需要注意的事项。它强制您使用共享的DLL CRT,在一个CRT中分配的内存不能在另一个CRT中释放。如果您在所有模块(dll的&exe的)中使用共享的dll-crt,那么您很好,它们都共享同一堆,如果不这样做,您将跨越crt,世界将崩溃。 除此之外,我同意这个公认的答案。创建工厂可能不应该为客户机代码定义所有权和生命周期管理。 |
|
5
0
不,不是。
布局
只有“标准布局”(C++ 11中的一个新概念,与旧的“POD =普通旧数据”概念)类型可以安全地在单独构建的模块之间传递。 |