在下面的代码中:void ResourceFitter::copyToLarvalResources( const gsl_vector* input ){ assert( input->size == invLarvalResources.size() ); if( invLarvalResources.size() != 365 ){ cout<<"error: iLR.size(): "<<invLarvalResources.size()<<endl; exit(21); } // inverting larval resources may help fitting algorithm, so we do that here: for( size_t i=0; i<invLarvalResources.size(); ++i ){ if( i >= 365 ){ cout<<"error: i="<<i<<endl; exit(22); } double val = gsl_vector_get( input, i ); invLarvalResources[i] = 1.0 / val; }}这是ResourceFitter.cpp中的几行。 380行是代码的最后一行(在invLarvalResources中分配)。 invLarvalResources是一个vector<double>。valgrind抱怨:==30152== Invalid write of size 8==30152== at 0x8ED3E5: OM::Transmission::Vector::ResourceFitter::copyToLarvalResources(gsl_vector const*) (ResourceFitter.cpp:380)==30152== by 0x8ECE99: OM::Transmission::Vector::ResourceFitter::sampler(gsl_vector const*) (ResourceFitter.cpp:334)==30152== by 0x8EB64D: OM::Transmission::Vector::ResourceFitter_minimise_sampler(gsl_vector const*, void*) (ResourceFitter.cpp:88)==30152== by 0x4F3249A: ??? (in /usr/lib/libgsl.so.0.16.0)==30152== by 0x8ED5C4: OM::util::MultidimMinimiser::MultidimMinimiser(gsl_multimin_fminimizer_type const*, unsigned long, double (*)(gsl_vector const*, void*), void*, gsl_vector*, gsl_vector*) (MultidimSolver.h:71)==30152== by 0x8EC45E: OM::Transmission::Vector::ResourceFitter::fit(unsigned long, OM::Transmission::Vector::ResourceFitter::FitMethod, unsigned long) (ResourceFitter.cpp:217)==30152== by 0x8EC308: OM::Transmission::Vector::ResourceFitter::fit() (ResourceFitter.cpp:183)==30152== by 0x8E474F: OM::Transmission::Vector::SpeciesModel::init2(unsigned long, std::list<OM::Host::Human, std::allocator<OM::Host::Human> > const&, int, double) (SpeciesModel.cpp:393)==30152== by 0x8DA29E: OM::Transmission::VectorModel::init2(std::list<OM::Host::Human, std::allocator<OM::Host::Human> > const&, int) (VectorModel.cpp:163)==30152== by 0x81C08F: OM::Population::createInitialHumans() (Population.cpp:165)==30152== by 0x8172E8: OM::Simulation::start() (Simulation.cpp:120)==30152== by 0x816615: main (openMalaria.cpp:53)==30152== Address 0x8ca3d10 is 0 bytes inside a block of size 2,920 free'd==30152== at 0x4C2658C: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)==30152== by 0x822515: __gnu_cxx::new_allocator<double>::deallocate(double*, unsigned long) (new_allocator.h:98)==30152== by 0x81FDBB: std::_Vector_base<double, std::allocator<double> >::_M_deallocate(double*, unsigned long) (stl_vector.h:156)==30152== by 0x81FC98: std::_Vector_base<double, std::allocator<double> >::~_Vector_base() (stl_vector.h:142)==30152== by 0x81E82B: std::vector<double, std::allocator<double> >::~vector() (stl_vector.h:351)==30152== by 0x8DB5D2: OM::Transmission::Vector::MosqLifeCycleParams::~MosqLifeCycleParams() (in /home/dhardy/code/openmalaria/build-debug/openMalaria)==30152== by 0x8DBA24: OM::Transmission::Vector::MosquitoTransmission::~MosquitoTransmission() (in /home/dhardy/code/openmalaria/build-debug/openMalaria)==30152== by 0x8E4719: OM::Transmission::Vector::SpeciesModel::init2(unsigned long, std::list<OM::Host::Human, std::allocator<OM::Host::Human> > const&, int, double) (SpeciesModel.cpp:391)==30152== by 0x8DA29E: OM::Transmission::VectorModel::init2(std::list<OM::Host::Human, std::allocator<OM::Host::Human> > const&, int) (VectorModel.cpp:163)==30152== by 0x81C08F: OM::Population::createInitialHumans() (Population.cpp:165)==30152== by 0x8172E8: OM::Simulation::start() (Simulation.cpp:120)==30152== by 0x816615: main (openMalaria.cpp:53)调试行(cout 那么valgrind只是在此上是错误的还是其他事情?在没有valgrind的情况下运行时,我没有遇到这个问题,但确实得到了一个奇怪的数值结果,该结果在隔离的单元测试中找不到。在解决另一个错误之前,我还遇到了SIGSEGV(我有把握地确定不应该引起SIGSEGV)。构建标记是-g -rdynamic,编译器通过ccache是​​gcc 4.6.1。如果您需要完整的资料,我很乐意为您指出:svn co 任何帮助将非常感激! 最佳答案 您到那里有很多代码...快速浏览一下,就会发现invLarvalResources是对vector所拥有的MosqLifeCycleParams的引用。发生的事情是您正在按值将MosquitoTransmission传递给ResourceFitter构造函数。当该对象被销毁时(即,构造函数返回后),它销毁了它的MosqLifeCycleParams,而该恰好拥有您刚刚存储了引用的向量。随之而来的是狂欢。您需要更加谨慎地使用引用和所有权(包括您习惯于将非常量引用返回给私有变量的习惯。这使它们有效地公开了。)道德:当您认为在工具中发现错误时,很可能是代码中的错误。关于c++ - valgrind:无效写入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7206145/
10-11 16:40