由于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运行时?别的什么?
最佳答案 有一种方法可以解决这个问题,但这有点不重要.与大多数库的其余部分一样,std :: string不直接使用new分配内存 – 相反,它使用分配器(默认情况下为std :: allocator< char>).
您可以提供自己的分配器,它使用您自己的DLL和可执行文件通用的堆分配例程,例如通过使用HeapAlloc获取内存,以及从那里子分配块.