I've encountered a memory error that I can't seem to figure out. It seems
to be that the HMMWV_Full destructors cause the (internal to the
suspension) LinkLock destructors to do a double free, only if a link lock
class is referenced (but not necessarily used) in the class. Here is a
minimal example:
#include <chrono_models/vehicle/hmmwv/HMMWV.h>
#include <chrono/physics/ChLinkLock.h>
using namespace chrono;
using namespace chrono::vehicle;
using namespace chrono::vehicle::hmmwv;
void foo() {
auto bar = chrono_types::make_shared<ChLinkLockRevolute>();
}
int main(int argc, char* argv[]) {
HMMWV_Full my_hmmwv;
my_hmmwv.SetContactMethod(ChContactMethod::SMC);
my_hmmwv.SetChassisCollisionType(CollisionType::NONE);
my_hmmwv.SetChassisFixed(false);
my_hmmwv.SetInitPosition(CSYSNORM);
my_hmmwv.SetPowertrainType(PowertrainModelType::SHAFTS);
my_hmmwv.SetDriveType(DrivelineTypeWV::AWD);
my_hmmwv.UseTierodBodies(true);
my_hmmwv.SetSteeringType(SteeringTypeWV::PITMAN_ARM);
my_hmmwv.SetBrakeType(BrakeType::SHAFTS);
my_hmmwv.SetTireType(TireModelType::TMEASY);
my_hmmwv.SetTireStepSize(1e-3);
my_hmmwv.Initialize();
return 0;
}
You can see that the function `foo` isn't even called, yet it's existence
causes the crash. If commented out, there are no issues. Here is the output
(development branch):
Chrono was not built with Thrust support. CHRONO collision system type not
available.
double free or corruption (out)
Aborted
I've attached Valgrind output too, which is more detailed. I'm hoping that
there is something really simple or obvious that I'm missing here. Thanks
in advance for any help figuring this out.
--
You received this message because you are subscribed to the Google Groups
"ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/projectchrono/43a25eec-b573-493e-ae60-04dc1b2c899dn%40googlegroups.com.
==112190== Memcheck, a memory error detector
==112190== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==112190== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==112190== Command: ./chrono_rollover
==112190==
==112190== Invalid free() / delete / delete[] / realloc()
==112190== at 0x484BB6F: operator delete(void*, unsigned long) (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x11C0EA: chrono::ChLinkLockRevolute::~ChLinkLockRevolute()
(ChLinkLock.h:377)
==112190== by 0x5FC1E12: chrono::vehicle::ChVehicleJoint::~ChVehicleJoint()
(in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x115F9C:
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release()
(shared_ptr_base.h:168)
==112190== by 0x60D9B62:
chrono::vehicle::ChDoubleWishbone::~ChDoubleWishbone() (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A35001:
std::_Sp_counted_ptr_inplace<chrono::vehicle::ChAxle,
std::allocator<chrono::vehicle::ChAxle>,
(__gnu_cxx::_Lock_policy)2>::_M_dispose() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A30555:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A3079C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F1DC: chrono::vehicle::hmmwv::HMMWV::~HMMWV() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x11C175: chrono::vehicle::hmmwv::HMMWV_Full::~HMMWV_Full()
(HMMWV.h:135)
==112190== by 0x113988: main (chrono_rollover.cpp:29)
==112190== Address 0x6ad05c0 is 16 bytes inside a block of size 3,760 alloc'd
==112190== at 0x4848899: malloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x5FC2881:
chrono::vehicle::ChVehicleJoint::CreateLink(chrono::vehicle::ChVehicleJoint::Type,
std::shared_ptr<chrono::ChBody>, std::shared_ptr<chrono::ChBody>,
chrono::ChCoordsys<double>) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x5FC4239:
chrono::vehicle::ChVehicleJoint::ChVehicleJoint(chrono::vehicle::ChVehicleJoint::Type,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
> const&, std::shared_ptr<chrono::ChBody>, std::shared_ptr<chrono::ChBody>,
chrono::ChCoordsys<double>,
std::shared_ptr<chrono::vehicle::ChVehicleBushingData>) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60DEB2E:
chrono::vehicle::ChDoubleWishbone::InitializeSide(chrono::vehicle::VehicleSide,
std::shared_ptr<chrono::vehicle::ChChassis>, std::shared_ptr<chrono::ChBody>,
std::vector<chrono::ChVector<double>, std::allocator<chrono::ChVector<double> >
> const&, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60E19A2:
chrono::vehicle::ChDoubleWishbone::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
double, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x607DD23:
chrono::vehicle::ChAxle::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
chrono::ChVector<double> const&, double, double, double) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A3176C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::Initialize(chrono::ChCoordsys<double>
const&, double) (in /usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F4A4: chrono::vehicle::hmmwv::HMMWV::Initialize() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x113974: main (chrono_rollover.cpp:26)
==112190==
==112190== Invalid free() / delete / delete[] / realloc()
==112190== at 0x484BB6F: operator delete(void*, unsigned long) (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x11C0EA: chrono::ChLinkLockRevolute::~ChLinkLockRevolute()
(ChLinkLock.h:377)
==112190== by 0x5FC1E12: chrono::vehicle::ChVehicleJoint::~ChVehicleJoint()
(in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60DA159:
chrono::vehicle::ChDoubleWishbone::~ChDoubleWishbone() (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A35001:
std::_Sp_counted_ptr_inplace<chrono::vehicle::ChAxle,
std::allocator<chrono::vehicle::ChAxle>,
(__gnu_cxx::_Lock_policy)2>::_M_dispose() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A30555:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A3079C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F1DC: chrono::vehicle::hmmwv::HMMWV::~HMMWV() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x11C175: chrono::vehicle::hmmwv::HMMWV_Full::~HMMWV_Full()
(HMMWV.h:135)
==112190== by 0x113988: main (chrono_rollover.cpp:29)
==112190== Address 0x6acde20 is 16 bytes inside a block of size 3,760 alloc'd
==112190== at 0x4848899: malloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x5FC2881:
chrono::vehicle::ChVehicleJoint::CreateLink(chrono::vehicle::ChVehicleJoint::Type,
std::shared_ptr<chrono::ChBody>, std::shared_ptr<chrono::ChBody>,
chrono::ChCoordsys<double>) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x5FC4239:
chrono::vehicle::ChVehicleJoint::ChVehicleJoint(chrono::vehicle::ChVehicleJoint::Type,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
> const&, std::shared_ptr<chrono::ChBody>, std::shared_ptr<chrono::ChBody>,
chrono::ChCoordsys<double>,
std::shared_ptr<chrono::vehicle::ChVehicleBushingData>) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60DE2D7:
chrono::vehicle::ChDoubleWishbone::InitializeSide(chrono::vehicle::VehicleSide,
std::shared_ptr<chrono::vehicle::ChChassis>, std::shared_ptr<chrono::ChBody>,
std::vector<chrono::ChVector<double>, std::allocator<chrono::ChVector<double> >
> const&, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60E19A2:
chrono::vehicle::ChDoubleWishbone::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
double, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x607DD23:
chrono::vehicle::ChAxle::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
chrono::ChVector<double> const&, double, double, double) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A3176C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::Initialize(chrono::ChCoordsys<double>
const&, double) (in /usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F4A4: chrono::vehicle::hmmwv::HMMWV::Initialize() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x113974: main (chrono_rollover.cpp:26)
==112190==
==112190== Invalid free() / delete / delete[] / realloc()
==112190== at 0x484BB6F: operator delete(void*, unsigned long) (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x11C0EA: chrono::ChLinkLockRevolute::~ChLinkLockRevolute()
(ChLinkLock.h:377)
==112190== by 0x5FC1E12: chrono::vehicle::ChVehicleJoint::~ChVehicleJoint()
(in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60D9E99:
chrono::vehicle::ChDoubleWishbone::~ChDoubleWishbone() (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A35001:
std::_Sp_counted_ptr_inplace<chrono::vehicle::ChAxle,
std::allocator<chrono::vehicle::ChAxle>,
(__gnu_cxx::_Lock_policy)2>::_M_dispose() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A30555:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A3079C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F1DC: chrono::vehicle::hmmwv::HMMWV::~HMMWV() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x11C175: chrono::vehicle::hmmwv::HMMWV_Full::~HMMWV_Full()
(HMMWV.h:135)
==112190== by 0x113988: main (chrono_rollover.cpp:29)
==112190== Address 0x70f6240 is 16 bytes inside a block of size 3,760 alloc'd
==112190== at 0x4848899: malloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x5FC2881:
chrono::vehicle::ChVehicleJoint::CreateLink(chrono::vehicle::ChVehicleJoint::Type,
std::shared_ptr<chrono::ChBody>, std::shared_ptr<chrono::ChBody>,
chrono::ChCoordsys<double>) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x5FC4239:
chrono::vehicle::ChVehicleJoint::ChVehicleJoint(chrono::vehicle::ChVehicleJoint::Type,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
> const&, std::shared_ptr<chrono::ChBody>, std::shared_ptr<chrono::ChBody>,
chrono::ChCoordsys<double>,
std::shared_ptr<chrono::vehicle::ChVehicleBushingData>) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60DE2D7:
chrono::vehicle::ChDoubleWishbone::InitializeSide(chrono::vehicle::VehicleSide,
std::shared_ptr<chrono::vehicle::ChChassis>, std::shared_ptr<chrono::ChBody>,
std::vector<chrono::ChVector<double>, std::allocator<chrono::ChVector<double> >
> const&, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60E190C:
chrono::vehicle::ChDoubleWishbone::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
double, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x607DD23:
chrono::vehicle::ChAxle::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
chrono::ChVector<double> const&, double, double, double) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A3176C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::Initialize(chrono::ChCoordsys<double>
const&, double) (in /usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F4A4: chrono::vehicle::hmmwv::HMMWV::Initialize() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x113974: main (chrono_rollover.cpp:26)
==112190==
==112190== Invalid free() / delete / delete[] / realloc()
==112190== at 0x484BB6F: operator delete(void*, unsigned long) (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x11C0EA: chrono::ChLinkLockRevolute::~ChLinkLockRevolute()
(ChLinkLock.h:377)
==112190== by 0x607F549: chrono::vehicle::ChSuspension::~ChSuspension() (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A35001:
std::_Sp_counted_ptr_inplace<chrono::vehicle::ChAxle,
std::allocator<chrono::vehicle::ChAxle>,
(__gnu_cxx::_Lock_policy)2>::_M_dispose() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A30555:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A3079C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F1DC: chrono::vehicle::hmmwv::HMMWV::~HMMWV() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x11C175: chrono::vehicle::hmmwv::HMMWV_Full::~HMMWV_Full()
(HMMWV.h:135)
==112190== by 0x113988: main (chrono_rollover.cpp:29)
==112190== Address 0x6acbf60 is 16 bytes inside a block of size 3,760 alloc'd
==112190== at 0x4848899: malloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x60DDC2C:
chrono::vehicle::ChDoubleWishbone::InitializeSide(chrono::vehicle::VehicleSide,
std::shared_ptr<chrono::vehicle::ChChassis>, std::shared_ptr<chrono::ChBody>,
std::vector<chrono::ChVector<double>, std::allocator<chrono::ChVector<double> >
> const&, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60E19A2:
chrono::vehicle::ChDoubleWishbone::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
double, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x607DD23:
chrono::vehicle::ChAxle::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
chrono::ChVector<double> const&, double, double, double) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A3176C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::Initialize(chrono::ChCoordsys<double>
const&, double) (in /usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F4A4: chrono::vehicle::hmmwv::HMMWV::Initialize() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x113974: main (chrono_rollover.cpp:26)
==112190==
==112190== Invalid free() / delete / delete[] / realloc()
==112190== at 0x484BB6F: operator delete(void*, unsigned long) (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x11C0EA: chrono::ChLinkLockRevolute::~ChLinkLockRevolute()
(ChLinkLock.h:377)
==112190== by 0x607F609: chrono::vehicle::ChSuspension::~ChSuspension() (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A35001:
std::_Sp_counted_ptr_inplace<chrono::vehicle::ChAxle,
std::allocator<chrono::vehicle::ChAxle>,
(__gnu_cxx::_Lock_policy)2>::_M_dispose() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A30555:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A3079C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::~HMMWV_VehicleFull() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F1DC: chrono::vehicle::hmmwv::HMMWV::~HMMWV() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x11C175: chrono::vehicle::hmmwv::HMMWV_Full::~HMMWV_Full()
(HMMWV.h:135)
==112190== by 0x113988: main (chrono_rollover.cpp:29)
==112190== Address 0x70f4380 is 16 bytes inside a block of size 3,760 alloc'd
==112190== at 0x4848899: malloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==112190== by 0x60DDC2C:
chrono::vehicle::ChDoubleWishbone::InitializeSide(chrono::vehicle::VehicleSide,
std::shared_ptr<chrono::vehicle::ChChassis>, std::shared_ptr<chrono::ChBody>,
std::vector<chrono::ChVector<double>, std::allocator<chrono::ChVector<double> >
> const&, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x60E190C:
chrono::vehicle::ChDoubleWishbone::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
double, double) (in /usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x607DD23:
chrono::vehicle::ChAxle::Initialize(std::shared_ptr<chrono::vehicle::ChChassis>,
std::shared_ptr<chrono::vehicle::ChSubchassis>,
std::shared_ptr<chrono::vehicle::ChSteering>, chrono::ChVector<double> const&,
chrono::ChVector<double> const&, double, double, double) (in
/usr/local/lib/libChronoEngine_vehicle.so)
==112190== by 0x4A3176C:
chrono::vehicle::hmmwv::HMMWV_VehicleFull::Initialize(chrono::ChCoordsys<double>
const&, double) (in /usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x4A0F4A4: chrono::vehicle::hmmwv::HMMWV::Initialize() (in
/usr/local/lib/libChronoModels_vehicle.so)
==112190== by 0x113974: main (chrono_rollover.cpp:26)
==112190==
Chrono was not built with Thrust support. CHRONO collision system type not
available.
==112190==
==112190== HEAP SUMMARY:
==112190== in use at exit: 78,620 bytes in 441 blocks
==112190== total heap usage: 2,792 allocs, 2,363 frees, 9,914,866 bytes
allocated
==112190==
==112190== LEAK SUMMARY:
==112190== definitely lost: 47,296 bytes in 16 blocks
==112190== indirectly lost: 31,316 bytes in 424 blocks
==112190== possibly lost: 0 bytes in 0 blocks
==112190== still reachable: 8 bytes in 1 blocks
==112190== suppressed: 0 bytes in 0 blocks
==112190== Rerun with --leak-check=full to see details of leaked memory
==112190==
==112190== For lists of detected and suppressed errors, rerun with: -s
==112190== ERROR SUMMARY: 12 errors from 5 contexts (suppressed: 0 from 0)