当我尝试运行此操作时,我遇到了分段错误:
#define FILE_NAME "test.html"
#define STRING_ARRAY_SIZE 1000000
int main() {
fstream file;
string line = "";
string string_array [STRING_ARRAY_SIZE];
int i = 0;
file.open(FILE_NAME);
while(getline(file, line)) {
string_array[i] = line;
i++;
cout << line << endl;
}
file.close();
}
相反,当我尝试编译它时,它可以工作:
#define FILE_NAME "test.html"
#define STRING_ARRAY_SIZE 100000
int main() {
fstream file;
string line = "";
string string_array [STRING_ARRAY_SIZE];
int i = 0;
file.open(FILE_NAME);
while(getline(file, line)) {
string_array[i] = line;
i++;
cout << line << endl;
}
file.close();
}
事实证明,唯一的区别是数组的大小。为什么它在100000时才起作用,而在1000000时它不起作用?最大尺寸是多少?谢谢。
答案 0 :(得分:3)
C ++没有设置限制,而是设置限制并取决于您使用的硬件。基本上你可以说,对于数组的大小设置了两个限制,一个是由类型设置的(你可以使用std::size_t
检查它可以采用的大小)用于定义数组的索引和第二个是物理内存限制。
实际上内存分配在两个地方,第一个是在堆上(动态分配的内存)。这里的大小限制基本上是可用硬件和操作系统模拟空间的能力的组合。第二个是在堆栈上(本地声明的变量)。这里的大小限制是编译器定义的。
答案 1 :(得分:3)
限制是系统(不仅是硬件,还包括软件,特别是操作系统和运行时)。另请参阅this question与您的非常相似。
你应该努力避免过大call stack frames。这些天在桌面或服务器机器上,我建议最多几十千字节用于最大的调用堆栈帧(通常少得多,即数百字节) - 特别是对于中间 - 非叶子或递归函数。典型的系统有一个能够增长到几兆字节的机器堆栈(但在嵌入式微控制器上,或者在Linux内核中,它可能只有几千字节!)。对于多线程应用程序,它应该少一些(因为每个线程都有自己的堆栈)。
在Linux和Posix系统上,您可以使用setrlimit(2)系统调用RLIMIT_STACK
来降低(有时可能略微增加)堆栈限制。在包含bash
shell的终端中,使用ulimit -s
内置版。
以下GCC选项可能会让您感兴趣:-fstack-usage
,-Wframe-larger-than=
,-fstack-split
在您的代码中,请考虑替换
string string_array [STRING_ARRAY_SIZE];
与
vector<string> string_vector;
并替换
string_array[i] = line;
i++;
与
string_vector.push_back(line);
答案 2 :(得分:1)
这可能是两件事。
首先,你需要内存来加载程序中的东西。所以,如果你没有足够的内存,你将拥有Segmentation fault
。你不能保留1000000,但你有足够的内存来保留,例如,100000。
其次,看看size_t参考。每个对象都有限制来表示其数据。
答案 3 :(得分:1)
首先:在编译时你不能有分段错误,在编译时它被称为&#34;编译错误&#34;,上面的代码看起来是正确的。
和往常一样:这取决于。内存堆栈存在局限性,具体取决于平台。