> MainClass(事情开始的类)
> XmlReader(用于解析xml文件的类)
> SerialPortSettings(保存有关从xml文件读取的串行端口的信息,例如波特率,comport等)
> 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对象:
MainClass::~MainClass() { delete m_serialPortListener;}
这失败了.我收到一个错误,说我在主类中删除了两次:
*** glibc detected *** ./ioserver: double free or corruption (out): 0x00860d80 ***
当我从SerialPortListener中删除delete& m_settings时,它工作正常.
但什么时候应该删除指针?什么是正确的做法?我真的希望我的xml-reader创建SerialPortSettings – 对象,将所有信息(波特率,comport等)返回给MainClass并创建SerialPortSettings对象本身.
让编译器进行优化.
但是在你需要处理指针生存期的地方,请使用智能指针,例如std :: auto_ptr或boost :: shared_ptr.关键的想法是定义所有权.所有者(在boost :: shared_ptr的情况下是引用该对象的智能指针的集合)负责删除 – 没有其他人.
干杯&心连心,
总结以上是内存溢出为你收集整理的c – 关于删除指针的问题.应从哪个类中删除?全部内容,希望文章能够帮你解决c – 关于删除指针的问题.应从哪个类中删除?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)