Ich lief in einen Haufen Korruption heute durch verschiedene CRT-Einstellungen (MTd MDD) in meiner DLL und mein eigentliches Projekt verursacht. Was ich seltsam fand, ist, dass die Anwendung nur abgestürzt ist, wenn ich den Destruktor in der DLL als virtuell einstelle. Gibt es eine einfache Erklärung dafür? Ich bekomme, dass ich Speicher nicht freigeben kann, der nicht auf meinem Heap ist, aber wo genau ist der Unterschied, wenn ich den Destruktor als nicht virtuell definiere.CRT virtuellen Destruktor
nur einige Code es ein wenig klarer
Die DLL sicher sein
#pragma once
class CTestClass
{
public:
_declspec(dllexport) CTestClass() {};
_declspec(dllexport) virtual ~CTestClass() {};
};
Und mein Projekt
int main(int argc, char* argv[])
{
CTestClass *foo = new CTestClass;
delete foo; // Crashes if the destructor is virtual but works if it's not
}
ALSO, haben Sie das gleiche Problem, indem Sie die declspec in die * class * ('class _declspec (dllexport) CTestClass {...}') verschieben und die pro-member declspecs entfernen? Nur neugierig. Beachten Sie, dass der aufrufende Code und die DLL dieselbe CRT verwenden sollten (debuggen oder release), also ist das etwas zu beachten. Ich bin mir nicht einmal sicher, dass Mixed-Modi unterstützt werden (glaube ich nicht). – WhozCraig
Sie haben mehrere Kopien des CRT in Ihrem Prozess. Und Sie exportieren nur die Klassenmethoden, nicht die V-Tabelle. Der Versuch, herauszufinden, wie das alles interagiert, um deinen Code zu bombardieren, ist nicht so produktiv, wird erwartet.Beim Exportieren einer Klasse mit virtuellen Methoden müssen Sie die gesamte Klasse exportieren. Stellen Sie __declspec (dllexport) neben das Schlüsselwort * class *. Und Sie müssen sicherstellen, dass ein einzelner Zuordner verwendet wird, um das Objekt zu erstellen und zu zerstören. Sehr schwer zu garantieren, es sei denn, Sie erstellen mit/MD konsistent und verwenden die exakt gleiche Compiler-Version. Die Offenlegung von C++ - Klassen über Modulgrenzen hinweg ist nur riskant. –
Sie haben wahrscheinlich Recht, auch wenn ich herausfinden, warum es nicht funktioniert, wird es mir nicht zu viel helfen. Danke trotzdem für deine Gedanken :) – Poisonbox