LoginSignup
0
0

More than 5 years have passed since last update.

C++ Builder XE4 > メモリ領域 > Error: プロジェクトProject1.exeは例外クラス $C00000FD (メッセージ 'stack overflow at 0xXXXXX')を送出しました > 対処: スタック領域から静的領域に変更

Last updated at Posted at 2019-01-09
動作環境
C++ Builder XE4

症状

  • 200,000個の要素を持つdouble型配列を定義
  • 実行時にエラーが発生

プロジェクトProject1.exeは例外クラス $C00000FD (メッセージ 'stack overflow at 0xXXXXX')を送出しました

問題のコード

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const int kNum = 200000;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    double vals[kNum] = { 0.0 };
}
//---------------------------------------------------------------------------

対応案1

vals[]の定義にstaticを付けて静的領域の定義にする。

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    static double vals[kNum] = { 0.0 };
}

静的領域

関数内の配列定義は通常スタック領域になる。
スタック領域を超えた要素数で定義されたときに'stack overflow at 0xXXXXX'になる。

組込みでも行う対処であるが、staticをつけることで、スタック領域でなく、静的領域に変更している。

備考

関数内で200,000個の配列を定義する必要があるか、は別の検討事項でもある。

該当コードについてはnew/deleteでの実装に変更した。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0