【发布时间】:2012-01-06 09:26:45
【问题描述】:
我有两个四类:
- MainClass(事情开始的类)
- XmlReader(用于解析 xml 文件的类)
- SerialPortSettings(保存有关从 xml 文件中读取的串行端口的信息,例如波特率、通信端口等)
- SerialPortListener(在其构造函数中引用一个 SerialPortSettings 对象)
MainClass 有一种从 xml 文件中读取内容的方法。 在这个方法中,它首先创建一个 XmlReader 的实例,并给它一个 xml 文件作为构造函数参数。这个 xmlReader 只需要存在于这个方法中:
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-object:
MainClass::~MainClass() {
delete m_serialPortListener;
}
这失败了。我收到一条错误消息,说我在主类中删除了两次:
*** glibc detected *** ./ioserver: double free or corruption (out): 0x00860d80 ***
当我从 SerialPortListener 中删除删除 &m_settings 时,它工作正常。 但是什么时候应该删除指针呢?正确的做法是什么?我真的希望我的 xml 阅读器创建 SerialPortSettings - 对象,将所有信息(波特率、comport 等)返回到 MainClass 并创建 SerialPortSettings 对象本身。
【问题讨论】: