c – 关于删除指针的问题.应从哪个类中删除?

c – 关于删除指针的问题.应从哪个类中删除?,第1张

概述我有两个四个班: > MainClass(事情开始的类) > XmlReader(用于解析xml文件的类) > SerialPortSettings(保存有关从xml文件读取的串行端口的信息,例如波特率,comport等) > SerialPortListener(在其构造函数中引用SerialPortSettings对象) MainClass有一个从xml文件中读取东西的方法. 在此方法中,它首 我有两个四个班:

> 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对象本身.

解决方法 一个好的解决方案是让xmlReader :: getSerialPortSettings按值返回SerialPortSettings.

让编译器进行优化.

但是在你需要处理指针生存期的地方,请使用智能指针,例如std :: auto_ptr或boost :: shared_ptr.关键的想法是定义所有权.所有者(在boost :: shared_ptr的情况下是引用该对象的智能指针的集合)负责删除 – 没有其他人.

干杯&心连心,

总结

以上是内存溢出为你收集整理的c – 关于删除指针的问题.应从哪个类中删除?全部内容,希望文章能够帮你解决c – 关于删除指针的问题.应从哪个类中删除?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225383.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存