C++大内存申请

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38132420/article/details/79170840

1、未始化的全局变量
代码:

int szTestData[1024 * 1024 * 1024] =  {0};
int main()
{

//   int* piTestData = new int[1024 * 1024 * 1024];

   return 0;
}

结果:
可以编译通过
但是运行结果为

Segmentation fault (core dumped)

2、初始化全局变量
代码:

int szTestData[1024 * 1024 * 1024] =  {1};
int main()
{

//   int* piTestData = new int[1024 * 1024 * 1024];

   return 0;
}

结果:

/usr/bin/ld: final link failed: Memory exhausted
collect2: error: ld returned 1 exit status

3、栈变量
其实可以不用看,栈变量肯定是不能超大的。
代码

#include <iostream>

using namespace std;

int fun(void) {
  int szTestData[1024 * 1024 * 1024] =  {1};
  return 0;
}

int main()
{
//   int* piTestData = new int[1024 * 1024 * 1024];
   fun();
   return 0;
}

结果和未初始化全局变量一致。

4、堆变量
代码:

#include <iostream>

using namespace std;


int main()
{
   int* piTestData = new int[1024 * 1024 * 1024];
//   fun();
   return 0;
}

结果:
可以编译过
运行结果为

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)

分析:
程序个数据段分布图如下:
这里写图片描述
1、未初始化全局变量bss段
在程序装入内核空间的的时候,就已经发现bss段占用了heap了。所以编译通过,执行core。
2、初始化全局变量
在链接的时候发现数据段太大了。编译失败
3、栈变量
运行时分配,跑到对于函数后分配内存的时候栈区溢出
4、堆变量。
内核分配内存失败,给程序抛出一个异常。

猜你喜欢

转载自blog.csdn.net/m0_38132420/article/details/79170840