在.dll中放置函数会导致调试断言失败错误

时间:2010-11-02 12:02:24

标签: dll getcwd

你好会员,

我今天遇到了一个非常奇怪的问题,我不确定是什么导致它。这是我用来获取当前工作目录的函数:

#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;

它工作正常。关于我做错了什么,我感到很困惑。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我终于找到了问题所在。该项目使用/ MT选项编译,因此.dll具有与原始文件不同的堆。所以当字符串大小大于它的初始大小(15)时,就会从.dll那边分配堆。但是字符串有从主程序端调用的析构函数,然后析构函数试图从.dll的堆中释放内存,从而导致“堆损坏错误”

解决方案是简单地使用/ MD选项进行编译。