并非所有本机全局变量都在混合模式.Net应用程序中被破坏,因为超
我的混合模式C应用程序我注意到以下奇怪的效果:
>如果我在Visual Studio外部启动可执行文件,则会正确销毁所有非托管全局变量. 我读到.Net有2秒的清理超时.这是否适用于整个非托管全局变量销毁?或者这是每个析构函数? 我很确定这个2秒超时是原因,因为当我在doexit方法的开头设置一个断点时,调试器会在应用程序退出时停止. 有没有办法在应用程序中更改此2秒超时?问题是,如果不是所有全局变量都被破坏,我的内存泄漏检测系统将报告大量内存泄漏. 编辑: 这是一个显示问题的示例程序. 由于我想创建一个混合模式应用程序,我编写了一个单独的main(本地编译)和一个单独的’add’函数(编译托管).这是主要的: #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,所以如果你想测试它,你不必复制/粘贴或重新输入所有内容. 编辑:稍微更改标题,使我们更清楚,因为我们有问题的实际原因. 解决方法
嗯确认问题.我需要思考/阅读更多相关内容.它真的开始看起来像一个bug.
请注意,我在任何时候都没有通过调试来运行任何此类操作,因为我的VS设置在某种程度上是不可避免的.感谢做命令行的构建! 为了记录,这是我在Win7-64,.NET 4.0,两个CPU内核和1Gb RAM上的初始运行(不重新编译,只是你的二进制文件): C:stacko>.main.exe Constructing x1 Constructing x2 Constructing x3 Constructing x4 Constructing x5 In beginning of main 3 At end of main Destructing x5 Destructing x4 Destructing x3 在本地再次编译并没有改变任何东西.我仔细检查过这确实是一个混合模式的工件: C:stacko>cl /c /EHsc /Od /Zi main.cpp Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. main.cpp C:stacko>link main.obj Microsoft (R) Incremental Linker Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. C:stacko>.main.exe Constructing x1 Constructing x2 Constructing x3 Constructing x4 Constructing x5 In beginning of main At end of main Destructing x5 Destructing x4 Destructing x3 Destructing x2 Destructing x1 检查:确认. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |