C++ C++;-检测到glibc
我有一个程序可以在我的OS X系统上完美运行,但每当我在linux机器上运行它时,它就会抛出一个错误,说明: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])
*** 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
,所以你再次超出了你的数组。请听我说,使用我提供的解决方案;它的每一部分都有作用一个重要的目的。(很有趣,你认为“它成功了,没有问题”是一个信号,表明它实际上是正确的,并且永远都是好的,当你第一次来到这里时,你的程序在一个系统上“成功了”,没有问题,但在另一个系统上却坏了!!)