C++ 使用向量时出现奇怪的运行时错误

C++ 使用向量时出现奇怪的运行时错误,c++,debugging,memory-management,valgrind,openmpi,C++,Debugging,Memory Management,Valgrind,Openmpi,当我与mpi并行运行代码时,我在运行时遇到了一个非常奇怪的问题: *** glibc detected *** ./QuadTreeConstruction: munmap_chunk(): invalid pointer: 0x0000000001fbf180 *** ======= Backtrace: ========= /lib/libc.so.6(+0x776d6)[0x7f38763156d6] ./QuadTreeConstruction(_ZN9__gnu_cxx13new_al

当我与mpi并行运行代码时,我在运行时遇到了一个非常奇怪的问题:

*** glibc detected *** ./QuadTreeConstruction: munmap_chunk(): invalid pointer: 0x0000000001fbf180 ***
======= Backtrace: =========
/lib/libc.so.6(+0x776d6)[0x7f38763156d6]
./QuadTreeConstruction(_ZN9__gnu_cxx13new_allocatorImE10deallocateEPmm+0x20)[0x423f04]
./QuadTreeConstruction(_ZNSt13_Bvector_baseISaIbEE13_M_deallocateEv+0x50)[0x423e72]
./QuadTreeConstruction(_ZNSt13_Bvector_baseISaIbEED2Ev+0x1b)[0x423c79]
./QuadTreeConstruction(_ZNSt6vectorIbSaIbEED1Ev+0x18)[0x4237d2]
./QuadTreeConstruction(_Z22findLocalandGhostCellsRK8QuadTreeRK6ArrayVIiES5_iRS3_S6_+0x849)[0x41dbbd]
./QuadTreeConstruction(main+0xa32)[0x41ca49]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f38762bcd8e]
./QuadTreeConstruction[0x41b029]
我的代码是valgrind,用于清理mpi库内部的一些错误(我使用OpenMpi,我以前见过很多次,但它们从来都不是问题;请参阅)。当我以串行方式运行时,我没有任何问题

我已经能够使用gdb跟踪到
SIGABORT
系统调用的问题,下面是代码中断时的堆栈:

0   raise   raise.c 64  0x7f4bd8655ba5  
1   abort   abort.c 92  0x7f4bd86596b0  
2   __libc_message  libc_fatal.c    189 0x7f4bd868f65b  
3   malloc_printerr malloc.c    6283    0x7f4bd86996d6  
4   __gnu_cxx::new_allocator<unsigned long>::deallocate new_allocator.h 95  0x423f04    
5   std::_Bvector_base<std::allocator<bool> >::_M_deallocate    stl_bvector.h   444 0x423e72    
6   std::_Bvector_base<std::allocator<bool> >::~_Bvector_base   stl_bvector.h   430 0x423c79    
7   std::vector<bool, std::allocator<bool> >::~vector   stl_bvector.h   547 0x4237d2    
8   findLocalandGhostCells  mpi_partition.cpp   249 0x41dbbd    
9   main    mpi_partition.cpp   111 0x41ca49    
0提升提升.c 64 0x7f4bd8655ba5
1异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常异常
2 u libc_消息libc_fatal.c 189 0x7f4bd868f65b
3 malloc_printerr malloc.c 6283 0x7f4bd86996d6
4\u gnu\u cxx::新的\u分配器::取消分配新的\u分配器。h 95 0x423f04
5标准::_Bvector_base::_M_解除分配stl Bvector.h 444 0x423e72
6标准::_Bvector_base::~_Bvector_base stl_Bvector.h 430 0x423c79
7 std::vector::~vector stl_bvector.h 547 0x4237d2
8 findlocalandghostcell mpi_partition.cpp 249 0x41dbbd
9主mpi_分区.cpp 111 0x41ca49
这听起来像是内存损坏,但我完全不知道是什么原因造成的。基本上,代码在一个函数中中断,该函数如下所示:

void findLocalandGhostCells(){
    std::vector<bool> foo(fooSize,false);

    // do stuff with foo; nothing crazy -- I promise

    return;
}
void findLocalandGhostCells(){
std::向量foo(fooSize,false);
//和福一起做事,没什么疯狂的,我保证
返回;
}

有人知道我现在应该做什么吗(

如果您非常确定向量操作本身是正确且不疯狂的,请尝试一步一步地跟踪向量的成员。您的其他一些操作可能损坏了向量的内存块。例如,一个memcpy侵入了向量的内存。

如果您非常确定向量操作本身是正确的不疯狂,尝试一步一步地跟踪向量的成员。可能是其他一些操作损坏了向量的内存块。例如,一个memcpy侵入了向量的内存。

您可能正在做一些疯狂的事情:(的确,我做了一些疯狂的事情……但更疯狂的是,另一个数组的问题是,我访问了超出范围的元素,我不知道为什么代码会在这里中断!如果访问超出范围的内存,尤其是写入内存,则会覆盖其他一些内存。在您的情况下,似乎可能覆盖了向量
foo
@JoachimPileborg我认为这就是问题的原因,因为内存损坏指针的位置在运行之间更改为不同的对象…您可能正在做一些疯狂的事情:(的确,我做了一些疯狂的事情……但更疯狂的是,另一个数组的问题是,我访问了超出范围的元素,我不知道为什么代码会在这里中断!如果访问超出范围的内存,尤其是写入内存,则会覆盖其他一些内存。在您的情况下,似乎可能覆盖了向量
foo
@JoachimPileborg我认为这就是问题的原因,因为内存损坏指针的位置在运行之间更改为不同的对象。。。