C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

ヒープオーバーフローとスタックオーバーフロー


ヒープオーバーフロー

ヒープは、動的変数を格納するために使用されます。これは、プロセスのメモリの領域です。 malloc()、calloc()、resize()これらの組み込み関数はすべて、通常、動的変数を格納するために使用されます。

ヒープオーバーフローは、-

のときに発生します

A)動的に多数の変数を割り当てる場合-

int main() {
   float *ptr = (int *)malloc(sizeof(float)*1000000.0));
}

B)メモリを継続的に割り当て、使用後に解放しない場合。

int main() {
   for (int i=0; i<100000000000; i++) {
      int *p = (int *)malloc(sizeof(int));
   }
}

スタックオーバーフロー

スタックは後入れ先出しのデータ構造です。関数内で使用されるローカル変数を格納するために使用されます。パラメータは、この関数とそのリターンアドレスを介して渡されます。

プログラムがより多くのメモリスペースを消費する場合、コンピュータメモリのスタックサイズが制限されているため、スタックオーバーフローが発生します。

スタックオーバーフローは次の場合に発生します

A)関数がそれ自体で無限に再帰的に呼び出されると、スタックは多数のローカル変数を格納できなくなるため、スタックオーバーフローが発生します-

void calculate(int a) {
   if (a== 0)
      return;
      a = 6;
      calculate(a);
}
int main() {
   int a = 5;
   calculate(a);
}

B)多数のローカル変数を宣言したり、大きな次元の配列や行列を宣言したりすると、スタックオーバーフローが発生する可能性があります。

int main() {
   A[20000][20000];
}

  1. C++で重複する円と長方形

    (radius、xc、yc)として表される円があると仮定します。ここで、(xc、yc)は円の中心座標です。また、(x1、y1、x2、y2)として表される軸に沿った長方形があります。ここで、(x1、y1)は左下隅の座標であり、(x2、y2)は右上隅の座標です。長方形の角。円と長方形が重なっていないか確認する必要があります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 関数eval()を定義します。これには、a、b、c、が必要です。 bの最大値とaとcの最小値を返します メインの方法から、次のようにしま

  2. C++でのDominoとTrominoのタイリング

    ドミノとトロミノの2種類の形状があるとします。以下のように回転させることができます- タイリングでは、すべての正方形をタイルで覆う必要があります。ここで、2つのタイルは、ボード上に2つの4方向に隣接するセルがあり、タイルの1つだけが両方の正方形をタイルで占めている場合にのみ異なります。 Nが与えられた場合、2xNボードをタイリングできる方法をいくつ見つける必要がありますか?したがって、入力が3の場合、出力は5になります。したがって、配置は[XYZ XXZ XYYXXYXYY]と[XYZYYZXZZ XYY XXY]になります。ここでは、タイルごとに異なる文字が使用されます。 これを