【发布时间】:2011-02-06 09:20:27
【问题描述】:
由于 Microsoft 在其非 DLL 版本的运行时中实现堆的方式,从 DLL 返回 C++ 对象可能会导致问题:
// dll.h
DLL_EXPORT std::string somefunc();
和:
// app.c - not part of DLL but in the main executable
void doit()
{
std::string str(somefunc());
}
如果 DLL 和 EXE 都是使用多线程 DLL 运行时库构建的,上述代码运行良好。
但是如果 DLL 和 EXE 是在没有 DLL 运行时库(单线程或多线程版本)的情况下构建的,则上面的代码会失败(使用调试运行时,由于断言 _CrtIsValidHeapPointer(pUserData) 失败,代码会立即中止;使用非调试运行时,堆会损坏,程序最终会在其他地方失败)。
两个问题:
- 除了要求所有代码都使用 DLL 运行时之外,还有其他方法可以解决这个问题吗?
- 对于将库分发给第三方的人,您如何处理?你不在你的 API 中使用 C++ 对象吗?您是否要求您的库的用户使用 DLL 运行时?还有什么?
【问题讨论】: