malloc.c "sYSMALLOC: Assertion"与C++项目一起执行
malloc.c "sYSMALLOC: Assertion" in execution with C++ project
FINAL_EDIT:发现问题,在for循环中,用作索引的计数器大于数组的元素数。奇怪的是,我没有收到分割错误,而是我提到的错误。为什么
感谢您的帮助
__________________
我在C++中有一个项目,我收到了这个错误(并非总是),如果有一个特定的全局变量充当int
数组的大小。
NEW EDIT_1->new
运算符我根本没有用过,除了主函数,我声明了一个指向类对象的新指针数组。如下所示:
Student* test[NUM_AM];
for(int i=0; i<NUM_AM; i++)
{
test[i] = new Student(random_elements);
}
有什么方法可以找到导致这种情况的原因吗?
错误是这样的(复制了gdb的输出):
malloc.c:3096: 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.
Program received signal SIGABRT, Aborted.
0x00007ffff75563a5 in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
in ../nptl/sysdeps/unix/sysv/linux/raise.c
同样valgrind给出的是:
==6775== HEAP SUMMARY:
==6775== in use at exit: 560 bytes in 35 blocks
==6775== total heap usage: 35 allocs, 0 frees, 560 bytes allocated
==6775==
==6775== LEAK SUMMARY:
==6775== definitely lost: 560 bytes in 35 blocks
==6775== indirectly lost: 0 bytes in 0 blocks
==6775== possibly lost: 0 bytes in 0 blocks
==6775== still reachable: 0 bytes in 0 blocks
==6775== suppressed: 0 bytes in 0 blocks
==6775== Rerun with --leak-check=full to see details of leaked memory
==6775==
==6775== For counts of detected and suppressed errors, rerun with: -v
==6775== Use --track-origins=yes to see where uninitialised values come from
==6775== ERROR SUMMARY: 806 errors from 2 contexts (suppressed: 4 from 4)
谢谢你抽出时间。
NEW_EDIT2:我用运行应用程序
valgrind --leak-check=full --track-origins=yes ./out
and NUM_AM = 25;
这是我在pastebin得到的输出:在这里!
NEW_EDIT3:我应该提到的是,该程序为学生创建了一个ID,并在一个bool数组和两个bool变量处为他们分配一个true/false值。变量NUM_AM用作声明为类成员的静态数组的索引。此外,NUM_AM在搜索其ID时用于多个功能。
NUM_AM>22时,即使在创建第一个学生之后也可能发生错误。带NUM_AM<=21,我无法通过多次串行执行程序来重现错误。
很高兴您找到了错误的来源。关于您的最后一个问题
奇怪的是,我没有收到分割错误,而是我提到的错误。为什么?
如果在堆栈上分配数组(例如,test
是堆栈数组),则访问超出数组边界的数据不会引发分段故障。相反,您开始覆盖堆栈上的其他重要数据。堆栈包含:
- 所有局部变量
- 函数的返回地址(以便函数知道返回到哪里)
- 前一帧指针和正确调用函数所需的其他内容
注意,上面的一些或全部可以在一定程度上进行优化。进一步阅读:http://en.wikipedia.org/wiki/Call_stack
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗