C++ C++;-检测到glibc

C++ C++;-检测到glibc,c++,c++11,g++,C++,C++11,G++,我有一个程序可以在我的OS X系统上完美运行,但每当我在linux机器上运行它时,它就会抛出一个错误,说明: *** glibc detected *** ./a.out: free(): invalid next size (fast): 0x08bd6008 *** a.out: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])

我有一个程序可以在我的OS X系统上完美运行,但每当我在linux机器上运行它时,它就会抛出一个错误,说明:

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x08bd6008 ***
a.out: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)
我正在使用c++11库。是因为这个吗


这是我的程序:

您的
pArray
是一个指针,只指向一个动态分配的
进程
,但您后来将其视为一个由数量不确定的
进程
对象组成的数组

如果在OSX机器上运行正常,那只是因为不能保证自动检测到这种编程错误。在那个特定的时间,你在Linux机器上很幸运

最简单的修复方法是预先分配N个
进程
对象,并将
numProcessesRequired
限制在该值:

static const size_t MAX_NUM_PROCESSES = 16;
process* pArray = new process[MAX_NUM_PROCESSES];

// later...
numProcessesRequired = atoi(argv[1]);
assert(numProcessesRequired <= MAX_NUM_PROCESSES);
static const size\u t MAX\u NUM\u PROCESSES=16;
进程*pArray=新进程[最大进程数];
//后来。。。
numProcessesRequired=atoi(argv[1]);

assert(numProcessesRequired Side注意:这条消息的措辞有多么糟糕,这听起来很有趣,因为它的意思是“检测到了一个glibc”(问题是一个glibc),而不是“glibc检测到了这个问题”(glibc是注意到这个问题的东西)。问题可能是内存损坏。你试过在valgrind下运行你的程序吗(用于查找各种内存问题的工具)?请下次在问题中发布测试用例。事实上,你也应该解决这个问题。如果你使用的是C++11,你不需要
process*pArray=new process;
atoi
。ChaniLastname:你的“数组”有多少个元素大pArray?这告诉我断言失败了:
断言失败了:(numProcessesRequired@ChaniLastnamé:所以为
numProcessesRequired
输入一个有效值,或者增加
MAX_NUM_PROCESSES
以满足您的需要。我刚刚添加了
pArray=new process[numProcessesRequired]
在主函数中,刚刚向
process*pArray;
做了声明,它就工作了。没有问题。@ChaniLastnamé:没有,你有UB。
numProcessesRequired
在用户输入之前是
0
,所以你再次超出了你的数组。请听我说,使用我提供的解决方案;它的每一部分都有作用一个重要的目的。(很有趣,你认为“它成功了,没有问题”是一个信号,表明它实际上是正确的,并且永远都是好的,当你第一次来到这里时,你的程序在一个系统上“成功了”,没有问题,但在另一个系统上却坏了!!)