我今天遇到了一个非常奇怪的问题,我不确定是什么导致它。这是我用来获取当前工作目录的函数:
#ifdef _WIN32
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#error "There is currently no support for non windows based systems!"
#endif
const std::string getCurrentPath()
{
char CurrentPath{_MAX_PATH];
GetCurrentDir(CurrentPath, _MAX_PATH);
CurrentPath[_MAX_PATH - 1] = '/0';
return std::string(CurrentPath);
}
此功能可作为独立功能使用。但是,如果我将它声明为类中的静态函数:
static __declspec(dllexport) const std::string getCurrentPath(void);
和.dll当我尝试
时,我得到“debug assertion failed error”std::cout<<CUtilities::getCurrentPath()<<std::endl;
如果我改为写:
std::string dir = CUtilities::getCurrentPath();
std::cout<<"Dir is : "<<dir<<std::endl;
它工作正常。关于我做错了什么,我感到很困惑。有什么想法吗?
答案 0 :(得分:1)
我终于找到了问题所在。该项目使用/ MT选项编译,因此.dll具有与原始文件不同的堆。所以当字符串大小大于它的初始大小(15)时,就会从.dll那边分配堆。但是字符串有从主程序端调用的析构函数,然后析构函数试图从.dll的堆中释放内存,从而导致“堆损坏错误”
解决方案是简单地使用/ MD选项进行编译。