加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

并非所有本机全局变量都在混合模式.Net应用程序中被破坏,因为超

发布时间:2020-12-16 06:56:29 所属栏目:百科 来源:网络整理
导读:我的混合模式C应用程序我注意到以下奇怪的效果: 如果我在Visual Studio外部启动可执行文件,则会正确销毁所有非托管全局变量. 如果我在Visual Studio外部启动可执行文件,然后附加调试器,则所有非托管全局变量都将被正确销毁. 我在Visual Studio调试器中启动
我的混合模式C应用程序我注意到以下奇怪的效果:

>如果我在Visual Studio外部启动可执行文件,则会正确销毁所有非托管全局变量.
>如果我在Visual Studio外部启动可执行文件,然后附加调试器,则所有非托管全局变量都将被正确销毁.
>我在Visual Studio调试器中启动可执行文件,并非所有非托管全局变量都被破坏.

我读到.Net有2秒的清理超时.这是否适用于整个非托管全局变量销毁?或者这是每个析构函数?

我很确定这个2秒超时是原因,因为当我在doexit方法的开头设置一个断点时,调试器会在应用程序退出时停止.
但是如果我在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

检查:确认.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读