私は2つの4つのクラスがあります。ポインタの削除に関する質問。どのクラスを削除する必要がありますか?
- MainClass(物事がスタートクラス)
- たXmlReader(xmlファイルを解析するために使用されるクラス)
- SerialPortSettingsは(シリアルに関する情報を保持していますxmlファイルから読み取られたポート、例えばボーレート、コンフォートなど)
- SerialPortListener(シリアルポートそのコンストラクタでortSettingsオブジェクト)
MainClassは、XMLファイルから物事を読むための方法があります。 このメソッドでは、最初にのインスタンスを作成し、XmlReaderを作成し、コンストラクタパラメータとしてxmlファイルを与えます。このxmlReaderは、このメソッド内に存在する必要があります:
XmlReader xmlReader (xmlFile);
xmlReaderはxmlFileを解析します。 MainClassは、get-methodsをXmlReaderで呼び出してxml-stuffにアクセスします。これまでのところすべてが良いです。
しかし、方法たXmlReaderオファーの一つは、XMLファイルから読み取られた情報に基づいてSerialPortSettingsのタイプのオブジェクトを作成する方法であって
SerialPortSettings* XmlReader::getSerialPortSettings() {
.... // reading stuff from xml file
return new SerialPortSettings(baudRate, dataBits, comport);
}
このメソッドが呼び出されますMainClassと戻り値がポインタに格納されています
SerialPortSettings* settings = xmlReader.getSerialPortSettings();
次のことMainCla SerialPortListener(MainClassが終了するまで存在しなければならないメンバ変数)を作成することです。 SerialPortListenerはそれのコンストラクタでSerialPortSettingsへの参照を取ります
m_serialPortListener = new SerialPortListener(*settings);
が故にSerialPortSettingsもMainClassが終了するまで存在している必要があり、それゆえ私はポインタとしてこれを作成しました。だからここ
は手がかりである:私はSerialPortSettings -objectを削除しようとしましたSerialPortListenerデストラクタで
:
SerialPortListener::~SerialPortListener() {
delete &m_settings;
}
はその後MainClassデストラクタで、私はSerialPortListenerを削除しました-目的:
MainClass::~MainClass() {
delete m_serialPortListener;
}
これは失敗します。
*** glibc detected *** ./ioserver: double free or corruption (out): 0x00860d80 ***
私はSerialPortListenerから削除& m_settingsを削除すると、それが正常に動作します:私は、私は、メインクラスで二回何かを削除したというエラーを取得します。 しかし、いつポインタを削除する必要がありますか?正しいことは何ですか?私は本当に私のXMLリーダーがSerialPortSettingsオブジェクトを作成し、すべての情報(ボーレート、comportなど)をMainClassに戻してSerialPortSettingsオブジェクト自体を作成するようにしたい。
私はこのソリューションが好きです!ありがとう:) – Lisa