C++ 中结构的构造函数导致非零退出代码
Posted
技术标签:
【中文标题】C++ 中结构的构造函数导致非零退出代码【英文标题】:Constructor of a Struct in C++ Causes Non-Zero Exit Code 【发布时间】:2017-06-28 07:48:06 【问题描述】:当我在下面的代码中调用我的 SegTree 结构的构造函数时,我不断得到一个非零退出代码。当我注释掉初始化结构的行时,程序运行没有问题。有人可以解释为什么会发生这种情况以及如何修复我的代码吗?
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <vector>
#include <string.h>
using namespace std;
struct SegTree
int N;
long long tree [1<<20], arr [1<<20];
SegTree(int x) N = x;
;
int main()
SegTree st(len);
return 0;
请帮忙,提前致谢!
编辑:我的问题不在于数组的大小,正如我在 cmets 中提到的那样。当它们被放置在结构之外时,我能够制作数组并运行代码。
【问题讨论】:
stdio.h
、stdlib.h
和 string.h
是 C 标准库,而不是 C++ 标准库。 C++ 标准库头文件永远不会有后缀.h
。 using namespace std;
is a bad practice。此外,初始化类成员的现代 C++ 方法是member list initialization。
您认为long long tree [1<<20], arr [1<<20];
会占用多少内存?具有自动存储期限?你的调用栈有多大?
long long tree [1<<20], arr [1<<20];
在堆栈上变得相当大。很可能溢出。我建议改用std::vector<long long> tree (1<<20), arr (1<<20);
。
Segmentation fault on large array sizes的可能重复
@tambre:我的 C++ 标准副本指定 stdio.h
等的细节与 cstdio
完全相同。它们在什么意义上“不是 C++ 标准库”? (请注意,在实践中,cstdio
始终将名称与std::
一样放在全局命名空间中,现在标准允许这样做。)
【参考方案1】:
哇。这是一个大结构:
struct SegTree
int N;
long long tree [1<<20], arr [1<<20];
1<<20
是 1 兆。 long long
通常是 8 个字节,所以你的结构是 16 MB ......你在堆栈上分配它。通常,程序会为堆栈分配 1Mbyte 的空间......所以它不适合!
解决方法是将数组变成向量。然后数组将被分配到堆上,你应该没问题:
std::vector<long long> tree = 1<<20;
std::vector<long long> arr = 1<<20;
(一旦你使用了向量,你可能会比在构造函数中以某个最大大小一次性分配内存要好得多)。
【讨论】:
正如我在早期的 cmets 中所说的,数组的大小不是问题。我能够在没有结构的情况下成功运行代码。 @YouKnowMe :您使用的是哪个编译器?如果 gcc 在堆栈上看到long long array[1<<20]
并将其转化为 long long *array = malloc(1<<23);
的道德等价物,我不会感到惊讶。 是数组大小是问题所在。尝试使用1<<10
或向量替换,我敢打赌它有效。
任何一个都有效。 :) 但是,我仍然对为什么我能够在结构之外分配如此大的数组大小感到困惑......
@YouKnowMe - 如果您将数组直接放入 main 中,编译器可以将数组优化到数据段中。这两种情况不需要可比。
啊,我明白了。我将更改我的代码以使用矢量。以上是关于C++ 中结构的构造函数导致非零退出代码的主要内容,如果未能解决你的问题,请参考以下文章