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.hstdlib.hstring.h 是 C 标准库,而不是 C++ 标准库。 C++ 标准库头文件永远不会有后缀.husing namespace std; is a bad practice。此外,初始化类成员的现代 C++ 方法是member list initialization。 您认为long long tree [1&lt;&lt;20], arr [1&lt;&lt;20]; 会占用多少内存?具有自动存储期限?你的调用栈有多大? long long tree [1&lt;&lt;20], arr [1&lt;&lt;20]; 在堆栈上变得相当大。很可能溢出。我建议改用std::vector&lt;long long&gt; tree (1&lt;&lt;20), arr (1&lt;&lt;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&lt;&lt;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&lt;&lt;20] 并将其转化为 long long *array = malloc(1&lt;&lt;23); 的道德等价物,我不会感到惊讶。 数组大小是问题所在。尝试使用1&lt;&lt;10 或向量替换,我敢打赌它有效。 任何一个都有效。 :) 但是,我仍然对为什么我能够在结构之外分配如此大的数组大小感到困惑...... @YouKnowMe - 如果您将数组直接放入 main 中,编译器可以将数组优化到数据段中。这两种情况不需要可比。 啊,我明白了。我将更改我的代码以使用矢量。

以上是关于C++ 中结构的构造函数导致非零退出代码的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个非常简单的构造函数会导致段错误?

在 C++ 构造函数中为结构数组分配存储[关闭]

C ++中的结构构造函数?

[C++潜心修炼]类与对象:构造与析构与拷贝构造

c++的复制构造函数

在 C++ 中的类构造函数中初始化结构数组