Размещение функции в .dll вызывает ошибку подтверждения отладки - PullRequest
0 голосов
/ 02 ноября 2010

Привет, коллеги,

Сегодня я столкнулся с очень странной проблемой, и я не совсем уверен в том, что ее вызывает.Вот функция, которую я использую для получения текущего рабочего каталога:

#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, я получаю «ошибку отладочного подтверждения», когда я пытаюсь сделать

std::cout<<CUtilities::getCurrentPath()<<std::endl;

Если явместо этого напишите:

std::string dir = CUtilities::getCurrentPath();
std::cout<<"Dir is : "<<dir<<std::endl;

все работает нормально.Я полностью сбит с толку относительно того, что я делаю неправильно.Есть идеи?

1 Ответ

1 голос
/ 04 ноября 2010

Я наконец выяснил, в чем проблема.Проект был скомпилирован с параметрами / MT, поэтому .dll имел кучу, отличную от исходного файла.Поэтому, когда размер строки был больше, чем ее первоначальный размер (15), куча выделялась со стороны .dll.Однако в строке вызывался деструктор со стороны основной программы, а затем деструктор пытался освободить память из кучи .dll, что привело к «ошибке повреждения кучи»

Решение было просто скомпилировать с параметрами / MD,

...