析构函数没有调用

时间:2012-12-07 14:17:31

标签: c++ destructor c++builder-xe2

这是我的WinMain方法的摘录。它并不完整,但我认为这足以说明问题的核心。请不要问为什么我应该自动删除数据模块。这完全是另一个问题(当应用程序初始化过早结束,并且在一个构造函数中有异常时,与错误的终结顺序有关。)

extern PACKAGE TDataModule_Local *DataModule_Local;

class TDataModule_Local :
   public TDataModule
{
...
public:
   __fastcall        TDataModule_Local(TComponent *Owner);
   __fastcall        ~TDataModule_Local();
}

WINAPI wWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    Application->Initialize();
    Application->CreateForm(__classid(TMainForm), &MainForm);
    Application->CreateForm(__classid(TDataModule_Local), &DataModule_Local);    
    Application->Run();    

    if (DataModule_Local != NULL)
    {
       delete DataModule_Local;     // destructor not called! why?
       DataModule_Local = NULL;
    }

    return 0;    
}

当我使用delete运算符时,不会调用奇怪的数据模块析构函数。在程序到达WinMain方法的括号后调用:

enter image description here

1 个答案:

答案 0 :(得分:1)

你说

  

在应该自动完成时明确删除数据模块

显然,任何设计用于自动释放它的代码仍在尝试这样做,幸福地不知道你的终结顺序问题。

仅仅因为你将指针设置为NULL并不意味着在退出时要清理的对象列表中没有指针的副本。