2013-04-15 2 views
1

У меня есть интерфейс 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)

ответ

2

Порядок уничтожения глобалов не гарантируется. В случае вашего тестового кода в DLL он, очевидно, уничтожает глобальный объект до обнаружения утечки, но когда он у вас есть в приложении, это не так. Он все равно будет уничтожен до выхода приложения.

Если у вас есть переменная внутри функции, а не глобальная, она будет существовать только в пределах функции. Он будет уничтожен в конце функции.

Смежные вопросы