gpt4 book ai didi

c++ - 构造函数中神秘的堆栈溢出

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:19 25 4
gpt4 key购买 nike

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

enter image description here

TForm_Upgrade_Database 的构造函数如下所示:

__fastcall TForm_Upgrade_Database::TForm_Upgrade_Database(TComponent* 所有者, int newest_version) :TForm(所有者) {

在尝试创建公式实例之后

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

我的程序抛出 EStackOverflow 异常

enter image description here

我停止程序并在 TForm_Upgrade_Database 构造函数中使用断点再次运行它。几个步骤后,调用堆栈如下所示:

enter image description here

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

最佳答案

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

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

关于c++ - 构造函数中神秘的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9772862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com