由于 Microsoft 在其非 DLL 版本的运行时中实现堆的方式,从 DLL 返回 C++ 对象可能会导致问题:
// dll.h
DLL_EXPORT std::string somefunc();
Run Code Online (Sandbox Code Playgroud)
和:
// app.c - not part of DLL but in the main executable
void doit()
{
std::string str(somefunc());
}
Run Code Online (Sandbox Code Playgroud)
如果 DLL 和 EXE 都是使用多线程 DLL 运行时库构建的,则上述代码运行良好。
但是,如果 DLL 和 EXE 是在没有 DLL 运行时库(单线程或多线程版本)的情况下构建的,则上述代码将失败(使用调试运行时,由于断言_CrtIsValidHeapPointer(pUserData)失败,代码立即中止;使用非调试运行时堆被破坏,程序最终在其他地方失败)。
两个问题:
有一种方法可以解决这个问题,但它有点不简单。与库的大多数其他部分一样,它std::string不直接使用new-- 分配内存,而是使用分配器(std::allocator<char>默认情况下为 )。
您可以提供自己的分配器,该分配器使用 DLL 和可执行文件所共用的自己的堆分配例程,例如通过使用HeapAlloc来获取内存,并从那里重新分配块。
| 归档时间: |
|
| 查看次数: |
2907 次 |
| 最近记录: |