2012-03-19 31 views
5

Đây là lớp thứ bậc mà chương trình của tôi sử dụng:Mysterious stack overflow trong constructor

enter image description here

Các constructor của TForm_Upgrade_Database đang tìm kiếm như sau:

__fastcall TForm_Upgrade_Database :: TForm_Upgrade_Database (TComponent * Chủ đầu tư, int newest_version) : TForm (Chủ sở hữu) { }

Sau khi cố gắng tạo ra thể hiện của công thức

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

chương trình của tôi ném EStackOverflow ngoại lệ

enter image description here

tôi dừng lại chương trình và chạy nó một lần nữa với breakpoint trong TForm_Upgrade_Database constructor. Sau vài bước callstack trông như thế này:

enter image description here

Làm thế nào là nó mà TCustomForm constructor giữ cố gắng để gọi constructor của hậu duệ của nó ???

trường hợp thử nghiệm tối thiểu:

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 
+2

Ảnh chụp màn hình và sơ đồ không thực sự giúp bất kỳ ai trong việc xác định sự cố. Vui lòng xây dựng [** trường hợp thử nghiệm ** tối thiểu] (http://sscce.org) và sau đó đăng mã. –

+0

bạn có đang tạo một đối tượng cập nhật khác trong hàm tạo không? – perreal

+0

Một vấn đề tràn ngăn xếp khác trên StackOverflow :) – nikhil

Trả lời

4

TForm có một construtor ảo mà mất TComponent*int thông số, trong thứ tự đó. Bạn đang ghi đè hàm tạo đó. Bằng cách gọi hàm tạo của lớp cơ sở chỉ có tham số TComponent*, bạn thực tế đang tạo ra một vòng lặp đệ quy khi các hàm tạo này gọi nhau trong nội bộ.

Giải pháp là những gì mà truthseeker đã nói. Bạn phải thay đổi các tham số của hàm tạo có nguồn gốc của bạn để bạn không ghi đè lớp cơ sở TComponent*/int hàm tạo nữa. Thay đổi thứ tự của các thông số là đủ hoặc bạn có thể thay đổi int thành một kiểu dữ liệu khác.

+0

Bắt tốt. Tôi chưa bao giờ gặp vấn đề này, nhưng điều đó càng may mắn hơn là phán quyết ... – Roddy

+0

Thú vị, tôi không để ý điều này. Tôi đã thử mọi cách để có thể chạy. – truthseeker

1

Tôi nghĩ rằng điều này đã làm với một số giải pháp không chuẩn trong thư viện delphi. Thư viện VCL được viết và biên dịch trong Delphi Pascal. Hợp tác với C++ được thực hiện thông qua các tệp giao diện (với phần mở rộng * .hpp). Mã nhị phân đã biên dịch có thể tìm kiếm các tham số của hàm tạo trên các khoảng bù bộ nhớ không chính xác. Vì vậy, đây có lẽ là một vấn đề gọi quy ước.

Tôi đã tạo thành công phiên bản formular khi thay đổi tham số trong hàm tạo để tham số mới là đầu tiên.

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); 
Các vấn đề liên quan