|
|
1
13
要记住的主要一点是DLL包含 代码 而不是
这就是为什么在西蒙的回答中他说:
因为如果由于某种原因,字符串s的副本在a.dll和b.dll之间不同,就会发生奇怪的事情。更糟糕的是,如果字符串本身在a.dll和b.dll之间是不同的,并且其中一个的析构函数知道清除另一个忽略的额外内存。。。你可能很难找到内存泄漏。也许更糟。。。a、 dll可能是根据完全不同的STL版本(即STLPort)构建的,而b.dll则是使用Microsoft的STL实现构建的。
对于向第三方公开DLL,这完全是另一回事。除非您希望严格要求客户机提供特定的生成设置,否则您将希望避免导出STL模板。我不建议你的客户严格执行特定的构建设置。。。他们可能有另一个第三方工具,希望您使用完全相反的构建设置。 (1) 是的,我知道在加载/卸载dll时静态和局部变量被实例化/删除。 |
|
|
2
11
以下是pod类定义:
注意,使用的内存分配函数是pod\u malloc和pod\u free—它们只是malloc和free,但在所有DLL之间使用相同的函数。在我的例子中,所有dll都使用malloc和free from the host EXE,因此它们都使用相同的堆,这就解决了堆内存问题。(你到底是怎么弄明白的,这取决于你自己。)
这个方法意味着复制整个对象。但是,您可以将引用传递给pod类型,因为存在
但是,您也可以专门化自己的类型,这意味着您可以有效地返回复杂类型,如
所以一旦设置好了,就可以像pod类不存在一样使用它。 |
|
|
3
2
我不确定“任何可以调用new/delete的东西”——这可以通过小心地使用具有适当分配器/deleter函数的共享指针等价物来管理。
当我需要这类功能时,我经常跨越边界使用虚拟接口类。然后,您可以为
|
|
|
4
0
为了
然后(假设您想使用std::list),您可以使用一个接口
|
|
0___________ · 我可以在整个程序生命周期内保持句柄打开吗 2 年前 |