5

这是我的程序使用的类层次结构:

在此处输入图像描述

TForm_Upgrade_Database 的构造函数如下所示:

__fastcall TForm_Upgrade_Database::TForm_Upgrade_Database(TComponent* Owner, int latest_version) : TForm(Owner) { }

尝试创建公式实例后

TForm_Upgrade_Database *dlg = new TForm_Upgrade_Database(this, newest_version);

我的程序抛出 EStackOverflow 异常

在此处输入图像描述

我停止了程序并在 TForm_Upgrade_Database 构造函数中使用断点再次运行它。几个步骤后调用堆栈看起来像这样:

在此处输入图像描述

TCustomForm 构造函数如何一直试图调用其后代的构造函数???

最小测试用例:

so_project.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "f_form.h"
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   TForm_Upgrade_Database *form = new TForm_Upgrade_Database(NULL, 10);
   delete form;
   form = NULL; 

   return 0;
}
//---------------------------------------------------------------------------

f_form.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "f_form.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm_Upgrade_Database *Form1;
//---------------------------------------------------------------------------
__fastcall TForm_Upgrade_Database::TForm_Upgrade_Database(TComponent* Owner, int x)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------

f_form.h:

//---------------------------------------------------------------------------

#ifndef f_formH
#define f_formH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm_Upgrade_Database : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
   __fastcall TForm_Upgrade_Database(TComponent* Owner, int x);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm_Upgrade_Database *Form1;
//---------------------------------------------------------------------------
#endif
4

2 回答 2

4

TForm有一个按顺序接受TComponent*和参数的虚​​拟构造函数。int您正在覆盖该构造函数。通过调用只接受参数的基类构造函数,TComponent*当这些构造函数在内部相互调用时,您实际上是在创建一个递归循环。

解决方案就是真理寻求者所说的。您必须更改派生构造函数的参数,以便不再覆盖基类TComponent*/int构造函数。更改参数的顺序就足够了,或者您可以将其更改int为不同的数据类型。

于 2012-03-20T22:05:39.033 回答
1

我认为这与 delphi 库中的一些非标准解决方案有关。VCL 库是用 Delphi Pascal 编写和编译的。与 C++ 的合作是通过接口文件(扩展名为 *.hpp)进行的。编译的二进制代码可能会在不正确的内存偏移量上搜索构造函数参数。所以这可能是调用约定的问题。

在构造函数中更改参数时,我成功创建了公式的实例,以便新参数是第一个。

f_form.h:

__fastcall TForm_Upgrade_Database(int x, TComponent* Owner);

f_form.cpp:

__fastcall TForm_Upgrade_Database::TForm_Upgrade_Database(int x, TComponent* Owner)
    : TForm(Owner)
{
}

so_project.cpp:

TForm_Upgrade_Database *form = new TForm_Upgrade_Database(10, NULL);
于 2012-03-20T08:08:22.487 回答