В моем приложении C ++ в смешанном режиме я замечаю следующие странные эффекты:
- Если я запускаю исполняемый файл вне Visual Studio, все неуправляемые глобальные переменные корректно уничтожаются.
- Если я запускаю исполняемый файл вне Visual Studio, а затем присоединяю отладчик, все неуправляемые глобальные переменные корректно уничтожаются.
- Когда я запускаю исполняемый файл в отладчике Visual Studio, не все неуправляемые глобальные переменные кажутся разрушенными.
Я прочитал, что .Net имеет 2-секундный таймаут для очистки. Это для всего неуправляемого уничтожения глобальной переменной? Или это на деструктор?
Я совершенно уверен, что причиной этого 2-секундного таймаута является то, что, когда я устанавливаю точку останова в начале метода doexit, отладчик останавливается там, когда приложение завершается.
Но если я установлю точку останова в конце функции doexit, эта точка останова никогда не будет достигнута.
Есть ли способ изменить этот 2-секундный тайм-аут из приложения? Проблема в том, что если не все глобальные переменные будут уничтожены, моя система обнаружения утечек памяти сообщит о большом количестве утечек памяти.
EDIT:
Это пример программы, показывающей проблему.
Поскольку я хотел создать приложение в смешанном режиме, я написал отдельную основную (скомпилированную изначально) и отдельную функцию добавления (скомпилированную управляемую). Это главное:
#include <iostream>
#include <windows.h>
extern int add(int,int);
class X
{
public:
X(char *name) : m_name(name) {std::cout << "Constructing " << m_name << std::endl;}
~X() {Sleep(1000); std::cout << "Destructing " << m_name << std::endl;}
private:
char *m_name;
};
X x1("x1");
X x2("x2");
X x3("x3");
X x4("x4");
X x5("x5");
int main()
{
std::cout << "In beginning of main" << std::endl;
int i = add(1,2);
std::cout << i << std::endl;
std::cout << "At end of main" << std::endl;
}
А это файл add.cpp:
int add (int one, int two)
{
int result = one;
result += two;
return result;
}
Они скомпилированы и связаны с помощью этих команд (используя VS2010 и .Net 4.0):
cl /c /EHsc /Od /Zi main.cpp
cl /c /Od /Zi /clr add.cpp
link /debug /debugtype:cv main.obj add.obj mscoree.lib nochkclr.obj /nodefaultlib:libcmt.lib
Это вывод, если приложение запущено:
Constructing x1
Constructing x2
Constructing x3
Constructing x4
Constructing x5
In beginning of main
3
At end of main
Destructing x5
Таким образом, уничтожение глобальных переменных прекращается после первой.
Если я уменьшу время сна с 1000 мс до 500 мс, глобальные переменные x5, x4 и x3 будут уничтожены, но затем также остановятся.
Я загрузил файлы в http://www.mediafire.com/?gil2hm2d3cw1zmz,, поэтому, если вы хотите проверить это, вам не нужно копировать / вставлять или перепечатывать все заново.
РЕДАКТИРОВАТЬ: Немного изменил заголовок, чтобы теперь стало понятнее, когда у нас есть реальная причина проблемы.