为什么表单的析构函数被调用两次?

2023-12-13

这段带有入口点的代码调用了表单的析构函数两次。

void Main(array<String^>^ args)
{
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
    MyApp::MyForm form;
    Application::Run(%form);
}

我已将其更改为

void Main(array<String^>^ args)
{
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
    Application::Run(gcnew MyApp::MyForm);
}

第二个版本仅调用析构函数一次。

为什么最初被调用两次?


   MyApp::MyForm form;

这是完全错误的。在 C++/CLI 中,了解何时在变量声明上使用 ^ 帽子非常重要。当您不使用它时,就像您在这里所做的那样,您将调用“堆栈语义”。它是 C++ RAII 模式的模拟,编译器自动在 Main() 末尾发出对析构函数的调用。

但这不应该发生,当您关闭窗口时,会自动调用 MyForm 对象的析构函数。因此,在您的情况下,您会看到它运行两次。实际上并不是致命的,与本机 C++ 非常不同,除非您在析构函数中使用本机代码做了一些不平凡的事情。请记住,引用类型的析构函数与对象销毁没有任何关系,这是垃圾收集器的工作。它仅用于清理本地资源。

有关堆栈语义的更多信息,请参阅这篇 MSDN 文章.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么表单的析构函数被调用两次? 的相关文章

  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 是否可以在 VC++/CLI 中重写 IEnumerable?

    我有一个返回一个的接口IEnumerable 我想在 VC CLI 中实现这个 因为数据来自第三方非托管 DLL 到目前为止我有 public ref class MyEnumerable IEnumerable
  • 在 C++/CLI 中创建时初始化静态字典

    今天我看到创建静态字典并初始化它的 C 代码 public static readonly Dictionary
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • .NET 图形重影

    我正在为我们正在开发的新应用程序制作一个示例 GUI 我已经决定了语言 但我可以使用任何第 3 方 DLL 或插件或任何我需要的东西 以使 GUI 尽可能无缝地工作 他们希望它非常像 mac ubuntu vista Windows 7 所
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • 编辑 InitializeComponent() 方法 C#

    我已经浏览了多个资源 试图找到何时手动向 InitializeComponent 添加代码的用例 但没有找到任何具体的内容 这表明我们不应该这样做 InitializeComponent 方法中的代码由设计者生成 不应手动修改 https
  • 使用对话框周围的语句来确保垃圾收集

    我们有一个包含数千个表单的 Windows 窗体应用程序 其中许多通过 ShowDialog 方法临时显示为对话框 该应用程序已经存在多年 我们发现由于表单或其使用的控件中的各种资源泄漏 许多表单没有及时进行垃圾收集 具体来说 我们发现了未
  • 标签中的路径显示

    NET 中有没有自动修剪路径字符串的方法 例如 C Documents and Settings nick My Documents Tests demo data demo data emx becomes C Documents dem
  • 如何使用 winforms 在 vb.net 中制作大型按钮网格(24x20 或类似)?

    我正在 vb net WinForms 中制作一个座位预订系统 我需要用户能够选择他们想要使用的座位并改变颜色 这样他们就可以知道它已选择 我开始尝试使用按钮 但 480 个按钮严重减慢了表单的加载时间 然后我尝试了在行 列中带有按钮的数据
  • 将组合框添加到 DataGridView 标头

    当我运行代码时 dataGridView TopLeftHeaderCell 也有一个组合框 我怎样才能改变这一点 这是我的代码 public void AddHeaders DataGridView dataGridView for in
  • 如何禁用 Alt + F4 关闭表单?

    What is the best way to disable Alt F4 in a c win form to prevent the user from closing the form 我使用表单作为弹出对话框来显示进度条 但我不希
  • 以编程方式更改 DataGridView 行上的只读模式

    在不解释整个上下文的情况下 我的问题基本上是这样的 我在 Windows 窗体上有一个 datagridview 它绑定到实体框架 DbSet dbSet
  • 如何使用 DateTime 计算已经过去了多少时间?

    我有一个启动操作的按钮单击事件 private void Diagnose Click object sender EventArgs e processfinish false timer2 Enabled true timerCount
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 确保应用程序独立于用户的屏幕分辨率

    有没有简单的方法可以在任何不同的 PC 上运行在 Visual Studio 2005 上用 C 创建的应用程序 无论其屏幕分辨率如何 屏幕分辨率 NET 2 0 中的 Windows 窗体具有一些处理不同 DPI 的机制 并且具有比 NE
  • 如何以编程方式向 datagridview 添加新行

    如果将行添加到DataTable DataRow row datatable1 NewRow row column2 column2 row column6 column6 datatable1 Rows Add row 怎么样DataGr
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp

随机推荐