c – 关于删除指针的问题.应从哪个类中删除?
我有两个四个班:
> MainClass(事情开始的类) MainClass有一个从xml文件中读取东西的方法. XmlReader xmlReader (xmlFile); xmlReader解析xmlFile. MainClass通过在XmlReader中调用get-methods来访问xml-stuff.到目前为止一切都很好. 但是,XmlReader提供的方法之一是根据从xml文件读取的信息创建SerialPortSettings类型的对象的方法: SerialPortSettings* XmlReader::getSerialPortSettings() { .... // reading stuff from xml file return new SerialPortSettings(baudRate,dataBits,comport); } 从MainClass调用此方法,返回值存储在指针中: SerialPortSettings* settings = xmlReader.getSerialPortSettings(); MainClass的下一步是创建一个SerialPortListener(它是一个成员变量,必须存在,直到退出MainClass). SerialPortListener在其构造函数中引用SerialPortSettings: m_serialPortListener = new SerialPortListener(*settings); 因此,在MainClass退出之前,SerialPortSettings也必须存在,因此我将其创建为指针. 所以这是线索: 在SerialPortListener析构函数中,我试图删除SerialPortSettings对象: SerialPortListener::~SerialPortListener() { delete &m_settings; } 然后在MainClass析构函数中删除了SerialPortListener对象: MainClass::~MainClass() { delete m_serialPortListener; } 这失败了.我收到一个错误,说我在主类中删除了两次: *** glibc detected *** ./ioserver: double free or corruption (out): 0x00860d80 *** 当我从SerialPortListener中删除delete& m_settings时,它工作正常. 解决方法
一个好的解决方案是让xmlReader :: getSerialPortSettings按值返回SerialPortSettings.
让编译器进行优化. 但是在你需要处理指针生存期的地方,请使用智能指针,例如std :: auto_ptr或boost :: shared_ptr.关键的想法是定义所有权.所有者(在boost :: shared_ptr的情况下是引用该对象的智能指针的集合)负责删除 – 没有其他人. 干杯&心连心, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |