【发布时间】:2015-07-02 09:55:04
【问题描述】:
Valgrind 告诉我,我的应用程序正在分配的内存之外写入。这可能是什么原因?输出如下:
==18307== 1 errors in context 3 of 5:
==18307== Invalid write of size 8
==18307== at 0x65A35F0: QDateTime::QDateTime() (in /usr/lib64/libQtCore.so.4.8.6)
==18307== by 0xB752F5: ora::Patient::Patient(ora::Site*)(oraPatient.cxx:53)
==18307== by 0xB359F2: main (main.cxx:32)
==18307== Address 0x16b3b680 is 8 bytes after a block of size 328 alloc'd
==18307== at 0x4C29118: operator new(unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==18307== by 0xB359E2: main (main.cxx:32)
所有成员在编译时都是已知的,不再发生动态分配。 oraPatient.cxx:53 中引用的行是构造函数。 sizeof(Patient) 返回 328,这正是分配为 valgrind 状态的大小。
在我的例子中,它总是这个类的最后两个成员。因此,如果我评论它们,下一个将是 QString 和 QDateTime。这就是为什么我认为它与 Qt 本身无关。
病人.h
#define SimpleProperty(member, _type) \
public: \
/**
* @brief Set member of type _type.
* @param _arg_##member Value to be set
* @see m_##member for a more detailed description
*/ \
Q_INVOKABLE void Set##member(_type _arg_##member) \
{ \
m_##member = _arg_##member;\
} \
/**
* @brief Get member of type _type.
* @return Returns the value of ##member
* @see m_##member for a more detailed description
*/ \
Q_INVOKABLE _type Get##member() const\
{ \
return m_##member;\
} \
protected: \
_type m_##member; \
class Patient : public RTObject
{
Q_OBJECT
public:
QString ProposeRootFolderName() const;
explicit Patient(ora::Site *parent = NULL);
virtual ~Patient();
Patient(const ora::Patient & other);
bool operator==(const Patient &patient);
bool operator!=(const ora::Patient & patient);
Q_INVOKABLE virtual QString GetStringRepresentation(const bool compriseChildren = true) const;
Q_INVOKABLE virtual bool IsValid() const;
Q_INVOKABLE void SetSite(ora::Site * parent);
Q_INVOKABLE void SetParent(ora::Site * parent);
Q_INVOKABLE ora::Site * GetParent() const;
Q_INVOKABLE ora::Site * GetSite() const;
Q_INVOKABLE bool Serialize(QDataStream &stream) const;
Q_INVOKABLE void Deserialize(QDataStream &stream);
Q_INVOKABLE const QList<ora::Treatment *> & GetTreatments() const;
Q_INVOKABLE ora::Treatment * GetTreatment(const int treatmentIndex) const;
Q_INVOKABLE bool AppendTreatment(ora::Treatment * treatment);
Q_INVOKABLE bool InsertTreatment(ora::Treatment * treatment, const int index);
Q_INVOKABLE bool RemoveTreatment(const int treatmentIndex);
Q_INVOKABLE bool RemoveTreatment(ora::Treatment * treatment);
Q_INVOKABLE void ClearTreatments();
Q_INVOKABLE QList<ora::StructureSet *> & GetStructureSets();
Q_INVOKABLE ora::StructureSet * GetStructureSet(const int structureSetIdx) const;
Q_INVOKABLE bool AppendStructureSet(ora::StructureSet * structureSet);
Q_INVOKABLE bool InsertStructureSet(ora::StructureSet * structureSet, const int index);
Q_INVOKABLE bool RemoveStructureSet(const int structureSetIdx);
Q_INVOKABLE int RemoveStructureSet(ora::StructureSet * structureSet);
Q_INVOKABLE void ClearStructureSets();
Q_INVOKABLE const QMap<QString, PatientSetup*> &GetPatientSetups() const;
Q_INVOKABLE PatientSetup *GetPatientSetup(const QString &patientSetupID) const;
Q_INVOKABLE bool InsertPatientSetup(const QString &patientSetupID, PatientSetup *patientSetup);
Q_INVOKABLE bool RemovePatientSetup(const QString &patientSetupID);
Q_INVOKABLE bool RemovePatientSetup(PatientSetup *patientSetup);
Q_INVOKABLE void ClearPatientSetups();
Q_INVOKABLE const QList<ImagingProtocol *> &GetImagingProtocols() const;
Q_INVOKABLE const QList<TreatmentOperation *> &GetTreatmentOperations() const;
Q_INVOKABLE const QList<Reg23Configuration *> &GetRegistrationConfigurations() const;
Q_INVOKABLE ImagingProtocol *GetImagingProtocol(const int i) const;
Q_INVOKABLE TreatmentOperation *GetTreatmentOperation(const int i);
Q_INVOKABLE Reg23Configuration *GetRegistrationConfiguration(const int i);
Q_INVOKABLE TreatmentOperation *GetTreatmentOperation(const QString toId);
Q_INVOKABLE Reg23Configuration *GetRegistrationConfiguration(const QString rcId);
Q_INVOKABLE bool AppendImagingProtocol(ImagingProtocol *protocol);
Q_INVOKABLE bool AppendTreatmentOperation(TreatmentOperation *to);
Q_INVOKABLE bool AppendRegistrationConfiguration(Reg23Configuration *rc);
Q_INVOKABLE bool RemoveImagingProtocol(const int i);
Q_INVOKABLE bool RemoveTreatmentOperation(const int i);
Q_INVOKABLE bool RemoveRegistrationConfiguration(const int i);
Q_INVOKABLE bool RemoveImagingProtocol(ImagingProtocol *protocol);
Q_INVOKABLE bool RemoveTreatmentOperation(TreatmentOperation *to);
Q_INVOKABLE bool RemoveRegistrationConfiguration(Reg23Configuration *rc);
Q_INVOKABLE void ClearImagingProtocols();
Q_INVOKABLE void ClearTreatmentOperations();
Q_INVOKABLE void ClearRegistrationConfigurations();
Q_INVOKABLE bool InsertImagingProtocol(ImagingProtocol *protocol, const int i);
Q_INVOKABLE bool InsertTreatmentOperation(TreatmentOperation *to, const int i);
Q_INVOKABLE bool InsertRegistrationConfiguration(Reg23Configuration *rc, const int i);
Q_INVOKABLE const QList<Study *> &GetStudies() const;
Q_INVOKABLE Study *GetStudy(const int i) const;
Q_INVOKABLE Study *GetStudy(const QString sid) const;
Q_INVOKABLE bool AppendStudy(Study *stud);
Q_INVOKABLE bool RemoveStudy(const int i);
Q_INVOKABLE bool RemoveStudy(Study *stud);
Q_INVOKABLE void ClearStudies();
Q_INVOKABLE bool InsertStudy(Study *stud, const int i);
protected:
Patient &operator=(const Patient&);
virtual void Initialize();
ora::Site *m_Site;
QList<ora::Treatment*> m_Treatments;
QList<ora::StructureSet*> m_StructureSets;
QMap<QString, PatientSetup*> m_PatientSetups;
QList<ImagingProtocol*> m_ImagingProtocols;
QList<TreatmentOperation *> m_TreatmentOperations;
QList<Study*> m_Studies;
QList<Reg23Configuration *> m_RegistrationConfigurations;
SimpleProperty(FirstName, QString)
SimpleProperty(LastName, QString)
Q_PROPERTY(QString FirstName READ GetFirstName WRITE SetFirstName)
Q_PROPERTY(QString LastName READ GetLastName WRITE SetLastName)
SimpleProperty(PatientID, QString)
Q_PROPERTY(QString PatientID READ GetPatientID WRITE SetPatientID)
SimpleProperty(OtherPatientIDs, QString)
Q_PROPERTY(QString OtherPatientIDs READ GetOtherPatientIDs WRITE SetOtherPatientIDs)
SimpleProperty(BarCodeID, QString)
Q_PROPERTY(QString BarCodeID READ GetBarCodeID WRITE SetBarCodeID)
SimpleProperty(IssuerOfPatientID, QString)
Q_PROPERTY(QString IssuerOfPatientID READ GetIssuerOfPatientID WRITE SetIssuerOfPatientID)
SimpleProperty(BirthDate, QDate)
Q_PROPERTY(QDate BirthDate READ GetBirthDate WRITE SetBirthDate)
SimpleProperty(PatientSex, QString)
Q_PROPERTY(QString PatientSex READ GetPatientSex WRITE SetPatientSex)
SimpleProperty(BirthTime, QTime)
Q_PROPERTY(QTime BirthTime READ GetBirthTime WRITE SetBirthTime)
SimpleProperty(OtherPatientNames, QString)
Q_PROPERTY(QString OtherPatientNames READ GetOtherPatientNames WRITE SetOtherPatientNames)
SimpleProperty(EthnicGroup, QString)
Q_PROPERTY(QString EthnicGroup READ GetEthnicGroup WRITE SetEthnicGroup)
SimpleProperty(Comments, QString)
Q_PROPERTY(QString Comments READ GetComments WRITE SetComments)
SimpleProperty(PatientSpeciesDescription, QString)
Q_PROPERTY(QString PatientSpeciesDescription READ GetPatientSpeciesDescription WRITE SetPatientSpeciesDescription)
SimpleProperty(PatientSpeciesCodeSequence, QString)
Q_PROPERTY(QString PatientSpeciesCodeSequence READ GetPatientSpeciesCodeSequence WRITE SetPatientSpeciesCodeSequence)
SimpleProperty(ResponsiblePerson, QString)
Q_PROPERTY(QString ResponsiblePerson READ GetResponsiblePerson WRITE SetResponsiblePerson)
SimpleProperty(ResponsiblePersonRole, QString)
Q_PROPERTY(QString ResponsiblePersonRole READ GetResponsiblePersonRole WRITE SetResponsiblePersonRole)
SimpleProperty(ResponsibleOrganization, QString)
Q_PROPERTY(QString ResponsibleOrganization READ GetResponsibleOrganization WRITE SetResponsibleOrganization)
SimpleProperty(HospitalID, QString)
Q_PROPERTY(QString HospitalID READ GetHospitalID WRITE SetHospitalID)
SimpleProperty(PatientSize, qreal)
Q_PROPERTY(qreal PatientSize READ GetPatientSize WRITE SetPatientSize)
SimpleProperty(PatientWeight, qreal)
Q_PROPERTY(qreal PatientWeight READ GetPatientWeight WRITE SetPatientWeight)
SimpleProperty(Address, QStringList)
Q_PROPERTY(QStringList Address READ GetAddress WRITE SetAddress)
SimpleProperty(CountryOfResidence, QString)
Q_PROPERTY(QString CountryOfResidence READ GetCountryOfResidence WRITE SetCountryOfResidence)
SimpleProperty(TelephoneNumbers, QStringList)
Q_PROPERTY(QStringList TelephoneNumbers READ GetTelephoneNumbers WRITE SetTelephoneNumbers)
SimpleProperty(Station, QString)
Q_PROPERTY(QString Station READ GetStation WRITE SetStation)
SimpleProperty(BirthName, QString)
Q_PROPERTY(QString BirthName READ GetBirthName WRITE SetBirthName)
SimpleProperty(Occupation, QString)
Q_PROPERTY(QString Occupation READ GetOccupation WRITE SetOccupation)
SimpleProperty(SmokingStatus, QString)
Q_PROPERTY(QString SmokingStatus READ GetSmokingStatus WRITE SetSmokingStatus)
SimpleProperty(PregnancyStatus, QString)
Q_PROPERTY(QString PregnancyStatus READ GetPregnancyStatus WRITE SetPregnancyStatus)
SimpleProperty(Attendant, QString)
Q_PROPERTY(QString Attendant READ GetAttendant WRITE SetAttendant)
SimpleProperty(AttendanceDate, QDateTime)
Q_PROPERTY(QDateTime AttendanceDate READ GetAttendanceDate WRITE SetAttendanceDate)
SimpleProperty(AbsenceDate, QDateTime)
Q_PROPERTY(QDateTime AbsenceDate READ GetAbsenceDate WRITE SetAbsenceDate)
SimpleProperty(LastAttendanceDate, QDateTime)
Q_PROPERTY(QDateTime LastAttendanceDate READ GetLastAttendanceDate WRITE SetLastAttendanceDate)
private:
};
QDataStream &operator<<(QDataStream &out, const ora::Patient &patient);
QDataStream &operator>>(QDataStream &in, ora::Patient &patient);
} // namespace ora
Q_DECLARE_METATYPE(ora::Patient)
病人.cxx
#include "oraPatient.h"
namespace ora
{
Patient::Patient(ora::Site *parent) : RTObject(parent)
{
Initialize();
m_Site = parent;
}
bool Patient::operator==(const Patient &patient)
{
return true;
}
bool Patient::operator!=(const ora::Patient &patient)
{
return !(*this == patient);
}
} // namespace ora
RTObject.cxx
#include "oraRTObject.h"
// SORRY
#include "oraCentralLoggingService.h"
namespace ora
{
RTObject::RTObject(QObject *parent) : QObject(parent)
{
qRegisterMetaTypeStreamOperators<ApprovalStatusType>("ora::RTObject::ApprovalStatusType");
qRegisterMetaTypeStreamOperators<BeamTypeType>("ora::RTObject::BeamTypeType");
qRegisterMetaTypeStreamOperators<PlanIntentType>("ora::RTObject::PlanIntentType");
qRegisterMetaTypeStreamOperators<PlanRelationshipType>("ora::RTObject::PlanRelationshipType");
qRegisterMetaTypeStreamOperators<PrimaryDosimeterUnitType>("ora::RTObject::PrimaryDosimeterUnitType");
qRegisterMetaTypeStreamOperators<RadiationTypeType>("ora::RTObject::RadiationTypeType");
qRegisterMetaTypeStreamOperators<RotationDirectionType>("ora::RTObject::RotationDirectionType");
qRegisterMetaTypeStreamOperators<ScanModeType>("ora::RTObject::ScanModeType");
qRegisterMetaTypeStreamOperators<TreatmentDeliveryTypeType>("ora::RTObject::TreatmentDeliveryTypeType");
qRegisterMetaTypeStreamOperators<ModeType>("ora::RTObject::ModeType");
qRegisterMetaTypeStreamOperators<RTObject::PatientPositionType>("ora::RTObject::PatientPositionType");
qRegisterMetaTypeStreamOperators<RTObject::QStringStringMap>("ora::RTObject::QStringStringMap");
m_StreamVersion = 0;
m_IsValid = true;
}
RTObject::RTObject(const RTObject &)
{
m_StreamVersion = 0;
m_IsValid = false;
}
RTObject::~RTObject()
{
}
} // namespace ora
创建患者:new Patient();
【问题讨论】:
-
你能把valgrind引用的代码贴在这里吗?
-
"为什么我不会向您展示的代码存在内存问题?"询问可以查看您的代码的人。
-
添加了代码。缺少的东西希望不相关,否则我也可以发布它们。
-
你是从干净开始构建的吗?包括运行
moc?看起来为写入较大对象而构建的代码与分配较小对象的代码相关联。 -
是的,我试过了,但没有帮助。
标签: c++ qt memory-management access-violation