【问题标题】:local array variable exc bad acces segmentation & local or global?局部数组变量 exc 错误访问分段和局部或全局?
【发布时间】:2017-03-04 22:43:04
【问题描述】:

您好,我已经看到了这个Maximum size of local array variable,但我想知道为什么如果数组设置为 ion global 就可以,而如果它在 main 之后就不行。

还有一个相关的问题: 拥有在 a.cpp 中定义并在 a.hpp 中使用 extern 声明的大内存对象是一种好习惯吗?或者更好地使用在本地函数中定义但定义为向量、新或 malloc 并将它们传递到函数参数中的大内存。

根据我的经验,这些问题是我必须解决的......

谢谢

#include <iostream>
using namespace std;

#define N (10000000000000)
int sd[N];

int main() {
  // int sd[N];
  return 0;
}

【问题讨论】:

  • 当你有非常大或未知大小的数组时,你想利用堆。
  • 改用std:vector&lt;int&gt;
  • 你的例程的局部变量是在栈上分配的,预计会比较小。全局变量(过度简化)分配在堆上,默认情况下这是一个更大的空间。您的变量也可以通过使用 new() 或 malloc() 使用本地例程中的堆空间分配,但是用于引用这些变量的指针可能会在函数退出时超出范围,从而导致内存泄漏,除非您首先使用 delete() 或 free() 取消分配内存。
  • 所以如果喜欢在 main() 中使用 int *t=new in[10000000000000],就像我理解的那样,当函数退出时,t 可能会指向另一个区域内存(f (int *t,size_t s))。为了确保不会出现问题,将 int * const t=new in[10000000000000] 与 f(int * const t,size_t s) 一起使用将是 100% 稳健的?
  • 更正:所以如果更喜欢使用 static int *t=new in[10000000000000] ...(使用静态没关系)

标签: c++ arrays global local


【解决方案1】:

在全局范围内声明:

int sd[N];

int main() {
  return 0;
}

生成的二进制文件变得非常大。当进程加载到内存中时,整个全局内存数据集都被映射进去。

在函数中声明:

int main() {
  int sd[N];
  return 0;
}

一旦函数被调用,内存就会被分配——并且它是从堆栈中分配的。线程的堆栈内存通常初始化得很低,接近兆字节或更少。一旦堆栈内存用完,游戏就结束了。

正如其他人在 cmets 中指出的那样,分配 LARGE 数组的正确方法是动态地使用通常充足的堆内存。

int main() {
  int* sd = new int[N];

  ...

  delete [] sd; // free the allocated memory
  return 0;
}

更好,所以你不必记住删除:

int main() {
  std::vector<int> sd(N);

  ...

}

【讨论】:

  • 为什么vector比c数组快?
  • @user7058377:容器不慢也不快。个别操作或慢或快。而且您只关心速度,并且如果您确实体验过某些东西太慢了。在那之前,您使用正确的工具。 std::vector&lt;int&gt; 肯定是这里的正确工具。
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多