私は、いくつかのkey:value要素を持ついくつかのセグメントからなるconfigファイルを処理するクラスを開発しています。私がメインコードでcfgElement
を宣言する場合、期待どおりもちろん、それはデストラクタをトリガし、C++クラスデストラクタをトリガする方法
class cfgElement {
public:
char *key;
char *val;
cfgElement *link;
cfgElement() {
key = nullptr;
val = nullptr;
link = nullptr;
}
~cfgElement() {
if (key != nullptr) delete key;
if (val != nullptr) delete val;
key = nullptr;
val = nullptr;
link = nullptr;
}
};
struct cfgSegment {
char Name[16];
cfgElement head;
};
class config {
private:
cfgSegment *segments;
public:
config() {
segments = new cfgSegment[5];
}
~config() {
for (int i=0; i<5; i++) {
// Clean up segments[i].head
}
}
};
:私は(ちょうど基本的な問題にまで切り詰め)次のコードを持っています。 segments[]
配列の一部であるオブジェクトは、config
オブジェクトが有効範囲外になったときにトリガされません。理由はわかりませんが、cfgElement
デストラクタをトリガする方法がありますか?彼らはポインタではないので、私はdelete
できません。
私はcfgSegment
のhead
要素のポインタを作り、そしてconfig
コンストラクタでsegments[]
配列をループ、個別に各cfgElement
を割り当てるが、それはそれを行うための唯一の方法であるだろうか?
'delete [] segments;' work? forループなしの '〜config()'の中にあります。 –
char *の代わりにstd :: stringを使い、スマートポインタ(つまりstd :: unique_ptr)を "生の"ポインタに置き換えて学ぶと、開発の容易さが増します。 – roalz
@roalzはい、私は文字列とスマートポインタが使いやすくなっていることを理解していますが、私が学んでいるように、私はこれらの問題を理解するために難しいことをやりたいと思います。 – alanlittle