DLL: Visual Studio 2013 (VC12)/App: Visual Studio 2010 (VC10)Удаление массив указателей аварий приложения вызывающего
Я создаю библиотеку, которая позволяет клиенту доступ к нашей системе. Однако представляется, что при удалении массива указателей, возвращаемых из dll, клиентское приложение выходит из строя. При удалении нормального указателя (без массива) все работает нормально. Идеи? Я заметил, что при использовании VC12 в качестве клиентского приложения массив удаляется ОК, хотя при использовании VC10 я получаю сбой.
Итак, мой вопрос: почему приложение клиента падает при удалении массива указателей при возврате из dll, если возникла проблема с удалением памяти, выделенной dll, не будет удалять систему; быть проблемой?
struct IDevice {
virtual ~IDevice() {}
char name[64];
};
class Device : public IDevice {
public:
Device() {}
~Device() {}
};
struct ISystem {
virtual ~IDevice() {}
virtual Result::Value GetDevices(Collection<IDevice**>* deviceCollection) = 0;
};
class System : public ISystem {
public:
Result::Value GetDevices(Collection<IDevice**>* deviceCollection) {
Result::Value result = Result::Success;
deviceCollection->collectionSize = 1;
deviceCollection->collection = new IDevice*[1];
IDevice* device = new Device();
Utilities::strcpy_safe(device->name, "blackey");
deviceCollection->collection[0] = device;
return result;
}
};
template<typename T>
struct Collection {
T collection;
int collectionSize;
};
///////// Main App ///////////
LoginInfo loginInfo;
string ip("192.168.1.2");
string u("admin");
string password("admin");
loginInfo.port = 443;
loginInfo.ssl = true;
strncpy_s(loginInfo.ipAddress, ip.c_str(), sizeof(loginInfo.ipAddress)-1);
strncpy_s(loginInfo.uname, u.c_str(), sizeof(loginInfo.uname)-1);
strncpy_s(loginInfo.password, password.c_str(), sizeof(loginInfo.password)-1);
ISystem* system = nullptr;
// SystemLogin calls into my dll which allocates memory for system OK
Result::Value result = SystemLogin(&loginInfo, &system);
Collection<IDevice**> devices;
// If the line below is uncommented, and the dll is modified to not allocate memory, but instead use this memory
// then below the delete[] devices.collection; works.
//devices.collection = new IDevice*[50];
// Makes a call into the library which populates devices
result = system->GetDevices(&devices);
for (int i = 0; i < devices.collectionSize; i++) {
// Each item in the array is deleted OK
delete devices.collection[i];
}
// Deleting this array of pointers crashes (see screenshots) when it's memory was allocated in the dll.
delete[] devices.collection;
// system deletes OK
delete system;
Вы не указали достаточно кода. Как насчет [mcve]. Включите как распределение, так и освобождение. –
Также вы не можете «удалить» что-то созданное с помощью malloc (в случае, если вы это сделали) – GameDeveloper
Дополнительный код. Дайте мне знать, если что-нибудь еще поможет. – Blackey