加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:55:34 所属栏目:百科 来源:网络整理
导读:我有两个四个班: 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的情况下是引用该对象的智能指针的集合)负责删除 – 没有其他人.

干杯&心连心,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读