C++ 复制C+的内存问题+;载体

C++ 复制C+的内存问题+;载体,c++,memory,C++,Memory,我以某种方式修复了代码中的内存问题,但不太确定实际发生了什么,我想看看是否有人能给我一个合理的解释 该代码涉及使用类ANN\u Force进行一些计算,最初在设置参数偏置节点的值时,我使用以下代码: values_of_biased_nodes = bias; 这给了我以下内存错误: Program received signal SIGSEGV, Segmentation fault. __memmove_avx_unaligned () at ../sysdeps/x86_64/multi

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

该代码涉及使用类
ANN\u Force
进行一些计算,最初在设置参数
偏置节点的值时,我使用以下代码:

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
问题消失了,但我不知道为什么。我的猜测是,如果没有
resize
有偏差节点的值=偏差
只需将
bias
中的任何内容直接移动到
values\u of_biased\u节点
,而无需检查
values\u of_biased\u节点
附近的内存是否足够大以容纳这些值。我想知道是否有人能帮我弄清楚?我还注意到,在一些机器中,它在不调整大小的情况下工作,这是由于不同的内存管理策略,还是仅仅因为这些机器有足够大的内存

谢谢大家!

更新:我用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
==13494==Memcheck,内存错误检测器
==13494==2002-2015年版权(C)和GNU GPL'd,朱利安·苏厄德等人。
==13494==使用Valgrind-3.11.0和LibVEX;使用-h重新运行以获取版权信息
==13494==命令:./test\u ANN\u包
==13494== 
/home/kengyangyao/.openmm/lib/plugins
运行测试\u向前\u和\u向后\u道具
==13494==条件跳转或移动取决于未初始化的值
==13494==at 0x4F9689E:std::vector::operator=(std::vector const&)(in/home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==by 0x4FE5DCE:std::vector::operator=(std::vector const&)(in/home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==by 0x5374121:OpenMM::ANN_Force::设置_偏置_节点(std::vector)的_值(ANN_Force.cpp:57)
==13494==by 0x40CD49:test_forward_和_backward_prop()(test_ANN_package.cpp:110)
==13494==0x41468A:main(test\u ANN\u package.cpp:598)
==13494==堆分配创建了未初始化的值
==13494==at 0x4C2E0EF:运算符新(无符号长)(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==13494==by 0x41BACF:u gnu_cxx::新的_分配器::分配(无符号长,无效常量*)(新的_分配器.h:104)
==13494==by 0x41ACA5:std::allocator_traits::allocate(std::allocator&,无符号长)(alloc_traits.h:491)
==13494==by 0x419809:std::_Vector_base::_M_allocate(无符号长)(stl_Vector.h:170)
==13494==by 0x41904A:std::_Vector_base::_M_create_storage(无符号长)(stl_Vector.h:185)
==13494==by 0x41728C:std::_Vector_base::_Vector_base(无符号长,std::分配器常量&)(stl_Vector.h:136)
==13494==by 0x4155AB:std::vector::vector(无符号长,std::分配器常量&)(stl_vector.h:278)
==13494==0x415072:OpenMM::ANN_Force::ANN_Force()(在/home/kengyangyao/Dropbox/temp_Linux/ANN_Force/openmmapi/tests/test_ANN_包中)
==13494==by 0x40C8AA:test_forward_和_backward_prop()(test_ANN_package.cpp:103)
==13494==0x41468A:main(test\u ANN\u package.cpp:598)
==13494== 
==13494==大小为1的写入无效
==13494==0x4C3245C处:memcpy@GLIBC_2.2.5(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==13494==by 0x4F96902:std::vector::operator=(std::vector const&)(in/home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==by 0x4FE5DCE:std::vector::operator=(std::vector const&)(in/home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==by 0x5374121:OpenMM::ANN_Force::设置_偏置_节点(std::vector)的_值(ANN_Force.cpp:57)
==13494==by 0x40CD49:test_forward_和_backward_prop()(test_ANN_package.cpp:110)
==13494==0x41468A:main(test\u ANN\u package.cpp:598)
==13494==地址0x3f947ae147ae147b不是堆栈、malloc或(最近)空闲
==13494== 
==13494== 
==13494==进程以信号11(SIGSEGV)的默认动作终止
==13494==一般保护故障
==13494==0x4C3245C处:memcpy@GLIBC_2.2.5(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==13494==by 0x4F96902:std::vector::operator=(std::vector const&)(in/home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==by 0x4FE5DCE:std::vector::operator=(std::vector const&)(in/home/kengyangyao/.openmm/lib/libOpenMM.so)
==13494==by 0x5374121:OpenMM::ANN_Force::设置_偏置_节点(std::vector)的_值(ANN_Force.cpp:57)
==13494==by 0x40CD49:test_forward_和_backward_prop()(test_ANN_package.cpp:110)
==13494==0x41468A:main(test\u ANN\u package.cpp:598)
==13494== 
==13494==堆摘要:
==13494==在出口处使用:7600块中的2016954字节
==13494==总堆使用率:9419个allocs,1819个frees,分配2218864个字节
==13494== 
==13494==泄漏汇总:
==13494==肯定丢失:0个块中有0个字节
==13494==间接丢失:0个块中有0个字节
==13494==可能丢失:0个块中有0个字节
==13494==仍可访问:7600个块中的2016954字节
==13494==其中可通过启发式访问:
==13494==stdstring:6个块中的196个字节
==13494==抑制:0个块中有0个字节
==13494==未显示可访问块(找到指针的块)。
==13494==若要查看它们,请重新运行:--leak check=full--show leak kinds=all
==13494== 
==13494==对于检测到的和抑制的错误计数,请使用:-v重新运行
==13494==错误摘要:来自2个上下文的2个错误(已抑制:来自0的0)
[1] 13494分段故障(堆芯倾倒)valgrind——泄漏检查=是——轨道原点=是。/test\u ANN\u包

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

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


在查看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