Нарушения кучи при освобождении параметра CStringArray & из экспортированной функции DLL - PullRequest
1 голос
/ 05 сентября 2011

Я разработал dll MFC, содержащий функцию, имеющую этот прототип:

//DLL code
long __declspec(dllexport) GetData(CString csIdentifier, CStringArray& arrOfData)
{
    //based on the identifier I must add some strings inside the string array
    arrOfData.Add("...");
    arrOfData.Add("...");
    /*.....................*/
    return 1;
}

Проблема, которая у меня возникает, заключается в том, что функция вызывается (из исполняемого файла). Будет вызван деструктор arrData, который попытается освободить память, но это не удастся, поскольку распределение arrOfData было выполнено в другой куче (внутри библиотеки DLL). Хотя я скомпилировал оба приложения (Exe и Dll), используя одни и те же параметры среды, у меня все еще есть проблема как в режиме отладки, так и в режиме выпуска. Как я могу решить проблему?

//Executable code
{
    CStringArray arrData;
    GetData("Identifier",arrData);
    //data is accesible
}

нарушение кучи происходит непосредственно перед существованием блока кода

1 Ответ

1 голос
/ 05 сентября 2011

Чтобы разделить объекты MFC, такие как CStringArray, через границу exe / dll, вам нужно сделать DLL расширением MFC. Смотри: https://msdn.microsoft.com/en-us/library/h5f7ck28(v=vs.140).aspx

Из раздела об управлении памятью:

MFCx0.dll и все библиотеки расширений DLL, загруженные в адресное пространство клиентского приложения, используют тот же распределитель памяти, загрузку ресурсов и другие глобальные состояния MFC, как если бы они находились в одном приложении. Это важно, потому что библиотеки DLL не-MFC и обычные библиотеки DLL делают прямо противоположное, и каждая DLL выделяется из своего собственного пула памяти.

Также возможно, что вашей функции DLL требуется AFX_MANAGE_STATE (AfxGetStaticModuleState ()) вверху для свойства, устанавливающего среду при внешнем вызове.

...