复制C ++向量的内存问题

时间:2018-04-02 19:40:48

标签: c++ memory

我以某种方式解决了我的代码中的内存问题,但我不太确定实际发生了什么,我想看看是否有人可能给我一个合理的解释。

代码涉及使用类ANN_Force进行一些计算,最初在设置参数values_of_biased_nodes时,我使用以下代码:

values_of_biased_nodes = bias;

这让我有以下内存错误:

Program received signal SIGSEGV, Segmentation fault.
__memmove_avx_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S:138
138 ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S: No such file 
or directory.

#0  __memmove_avx_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-avx-unaligned.S:138
#1  0x00007ffff7a0c903 in std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) () from /home/kengyangyao/.openmm/lib/libOpenMM.so
#2  0x00007ffff7a5bdcf in std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::operator=(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&) () from /home/kengyangyao/.openmm/lib/libOpenMM.so
#3  0x00007ffff76a3122 in OpenMM::ANN_Force::set_values_of_biased_nodes (this=0x6480e0, bias=...)
at /home/kengyangyao/Dropbox/temp_Linux/ANN_Force/openmmapi/src/ANN_Force.cpp:57
#4  0x000000000040cd4a in test_forward_and_backward_prop () at test_ANN_package.cpp:110
#5  0x000000000041468b in main (argc=1, argv=0x7fffffffdae8) at test_ANN_package.cpp:598

当我添加一行时:

values_of_biased_nodes.resize(bias.size());
values_of_biased_nodes = bias;

问题消失但我不明白为什么。我的猜测是没有resizevalues_of_biased_nodes = bias;只是将bias中的任何内容直接移动到values_of_biased_nodes而不检查values_of_biased_nodes附近的内存是否足够大以容纳值。我想知道是否有人可以帮我解决这个问题?另外我注意到在某些机器上它没有resize,它是由于不同的内存管理策略,还是因为那些机器有足够大的内存?

谢谢!

更新:我用valgrind运行它,这是输出:

==13494== Memcheck, a memory error detector
==13494== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==13494== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==13494== Command: ./test_ANN_package
==13494== 
/home/kengyangyao/.openmm/lib/plugins
running test_forward_and_backward_prop
==13494== Conditional jump or move depends on uninitialised value(s)
==13494==    at 0x4F9689E: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==    by 0x4FE5DCE: std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::operator=(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&) (in /home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==    by 0x5374121: OpenMM::ANN_Force::set_values_of_biased_nodes(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >) (ANN_Force.cpp:57)
==13494==    by 0x40CD49: test_forward_and_backward_prop() (test_ANN_package.cpp:110)
==13494==    by 0x41468A: main (test_ANN_package.cpp:598)
==13494==  Uninitialised value was created by a heap allocation
==13494==    at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13494==    by 0x41BACF: __gnu_cxx::new_allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::allocate(unsigned long, void const*) (new_allocator.h:104)
==13494==    by 0x41ACA5: std::allocator_traits<std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::allocate(std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, unsigned long) (alloc_traits.h:491)
==13494==    by 0x419809: std::_Vector_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_allocate(unsigned long) (stl_vector.h:170)
==13494==    by 0x41904A: std::_Vector_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_M_create_storage(unsigned long) (stl_vector.h:185)
==13494==    by 0x41728C: std::_Vector_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::_Vector_base(unsigned long, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) (stl_vector.h:136)
==13494==    by 0x4155AB: std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::vector(unsigned long, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&) (stl_vector.h:278)
==13494==    by 0x415072: OpenMM::ANN_Force::ANN_Force() (in /home/kengyangyao/Dropbox/temp_Linux/ANN_Force/openmmapi/tests/test_ANN_package)
==13494==    by 0x40C8AA: test_forward_and_backward_prop() (test_ANN_package.cpp:103)
==13494==    by 0x41468A: main (test_ANN_package.cpp:598)
==13494== 
==13494== Invalid write of size 1
==13494==    at 0x4C3245C: memcpy@GLIBC_2.2.5 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13494==    by 0x4F96902: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==    by 0x4FE5DCE: std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::operator=(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&) (in /home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==    by 0x5374121: OpenMM::ANN_Force::set_values_of_biased_nodes(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >) (ANN_Force.cpp:57)
==13494==    by 0x40CD49: test_forward_and_backward_prop() (test_ANN_package.cpp:110)
==13494==    by 0x41468A: main (test_ANN_package.cpp:598)
==13494==  Address 0x3f947ae147ae147b is not stack'd, malloc'd or (recently) free'd
==13494== 
==13494== 
==13494== Process terminating with default action of signal 11 (SIGSEGV)
==13494==  General Protection Fault
==13494==    at 0x4C3245C: memcpy@GLIBC_2.2.5 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13494==    by 0x4F96902: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==    by 0x4FE5DCE: std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >::operator=(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > > const&) (in /home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==    by 0x5374121: OpenMM::ANN_Force::set_values_of_biased_nodes(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >) (ANN_Force.cpp:57)
==13494==    by 0x40CD49: test_forward_and_backward_prop() (test_ANN_package.cpp:110)
==13494==    by 0x41468A: main (test_ANN_package.cpp:598)
==13494== 
==13494== HEAP SUMMARY:
==13494==     in use at exit: 2,016,954 bytes in 7,600 blocks
==13494==   total heap usage: 9,419 allocs, 1,819 frees, 2,218,864 bytes allocated
==13494== 
==13494== LEAK SUMMARY:
==13494==    definitely lost: 0 bytes in 0 blocks
==13494==    indirectly lost: 0 bytes in 0 blocks
==13494==      possibly lost: 0 bytes in 0 blocks
==13494==    still reachable: 2,016,954 bytes in 7,600 blocks
==13494==                       of which reachable via heuristic:
==13494==                         stdstring          : 196 bytes in 6 blocks
==13494==         suppressed: 0 bytes in 0 blocks
==13494== Reachable blocks (those to which a pointer was found) are not shown.
==13494== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==13494== 
==13494== For counts of detected and suppressed errors, rerun with: -v
==13494== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
[1]    13494 segmentation fault (core dumped)  valgrind --leak-check=yes --track-origins=yes ./test_ANN_package

似乎某些内存未正确处理?

1 个答案:

答案 0 :(得分:0)

将一个向量分配给另一个向量不需要在执行赋值之前调整目标向量的大小;这将是一个糟糕的设计。我怀疑你有其他的记忆问题,这只是揭示了它们。你试过在valgrind下运行吗?

在查看了你的valgrind输出之后,很明显你有内存损坏,但很难确切地说明在没有看到令人讨厌的源代码行的情况下发生了什么。我建议在gdb下运行并打破生成第一个valgrind错误的行。如果您可以自己解决问题,那么修复它并在valgrind下重新运行它,根据需要重复,直到您修复所有错误。如果您无法解决问题,请发布违规行+ - 10行,我会看看。