У меня есть интерфейс C++ и производный класс этого интерфейса в одной DLL, я использую класс в другом процессе, включая заголовочный файл интерфейса и импортирую фабричную функцию, которая возвращает объект производного класса (COM стиль):Глобальный интеллектуальный указатель не очищается должным образом
MyInterface
{
public:
virtual ~MyInterface(){}
virtual A() = 0;
}
MyDerivedClass : MyInterface
{
public:
virtual ~MyDerivedClass(){...};
A(){...};
}
__declspec(dllexport) MyInterface* getObject()
{
return (new MyDerivedClass());
}
Когда я испытываю в моей DLL (модульное тестирование), я так:
std::tr1::shared_ptr<MyInterface> MyInterfaceObj; //global
func1() //initilize
{
std::tr1::shared_ptr<MyInterface> temp(getObject());
MyInterfaceObj.swap(temp);
}
func2()
{
//use MyInterfaceObj;
}
все в порядке, я использую визуальный детектор утечки , нет жалоб, и я вижу, что вызывается деструктор MyDerivedClass.
Однако, когда я выполняю то же самое в своем процессе (который загружает DLL), деструктор MyDerivedClass никогда не вызывается, а VLD жалуется на утечки памяти.
НО, если я объявляю все внутри func2() [в моем процессе], все работает отлично, отсутствие утечек и деструктор:
func2()
{
std::tr1::shared_ptr<MyInterface> MyInterfaceObj; // not global anymore
std::tr1::shared_ptr<MyInterface> temp(getObject());
MyInterfaceObj.swap(temp); //I know this is useless here, just wanted to have the same steps as before
//use MyInterfaceObj;
}
мне нужно иметь первую структуру в моем процессе (глобальная переменная, инициализированная одной функцией, затем используется внутри функции биения сердца).
Любая идея, почему это происходит?!, Я попытался сделать функцию для освобождения памяти (она «удалила это») и передать ее конструктору интеллектуальных указателей, но это ничего не меняет.
(с использованием Visual C++ 2008 SP1)