gpt4 book ai didi

c++ - 简单的 C++ 程序间歇性段错误

转载 作者:太空宇宙 更新时间:2023-11-04 15:52:52 26 4
gpt4 key购买 nike

我目前正在学习 Thinking in C++,第 9 章的练习 15 给出了计算内联和非内联构造函数之间差异的说明。这样做时,我在一个数组中创建了一个对象实例的指标卸载,但是当我到达某个点时,程序开始间歇性地出现段错误。我没有做任何特别的事情,而且这个数字似乎也不是神奇的(接近 2 的幂或任何东西),所以它让我觉得很奇怪。事实上,这些对象都非常小,只包含一个整数。

我没有使用任何自定义编译或优化选项,而是使用标准 g++(不是 icc 或任何东西)。

这应该是一个简单的程序,我被这个问题难住了。任何见解都将不胜感激,因为即使是 strace 输出(如下)也没有给我任何提示。

提前谢谢你。

ex15.cc:

#include <ctime>
#include <iostream>
using namespace std;

class A
{
static int max_id;
int id;
public:
A() { id = ++max_id; }
};
int A::max_id = 0;

class B
{
A a;
public:
B() {}
};

int main()
{
clock_t c1, c2;
cout << "Before" << endl;
c1 = clock();
B b[2093550]; // intermittent segfault around this range
c2 = clock();
cout << "After; time = " << c2 - c1 << " usec." << endl;
getchar();
}

运行日志:

$ ./ex15
Before
After; time = 40000 usec.
$ ./ex15
Segmentation fault
$ ./ex15
Before
After; time = 40000 usec.
$ ./ex15
Segmentation fault
$ ./ex15
Before
After; time = 40000 usec.
$ ./ex15
Before
After; time = 40000 usec.
$ ./ex15
Segmentation fault

strace 输出显示它死在这里:

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7
f93000
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

从成功的运行来看:

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7
f4c000
write(1, "Before\n", 7) = 7
times({tms_utime=0, tms_stime=0, tms_cutime=0, tms_cstime=0}) = -1160620642
times({tms_utime=4, tms_stime=0, tms_cutime=0, tms_cstime=0}) = -1160620637
write(1, "After; time = 40000 usec.\n", 26) = 26
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7
f4b000
read(0, "\n", 1024) = 1
munmap(0xb7f4c000, 4096) = 0
exit_group(0) = ?

最佳答案

如果 sizeof(B) 为 4 个字节,则该数组 (b) 的大小为 8374200 个字节。这非常接近我猜测的默认最大线程堆栈大小 8 MiB(8388608 字节)。所以看起来你的堆栈溢出了。

关于c++ - 简单的 C++ 程序间歇性段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5112852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com