【发布时间】:2017-07-09 23:43:28
【问题描述】:
我正在开发一个类来处理配置文件,它由许多段组成,每个段都有许多键:值元素。我有以下代码(简化为基本问题):
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
}
}
};
如果我在主代码中声明一个cfgElement,它当然会按预期触发析构函数。当config 对象超出范围时,那些属于segments[] 数组的部分不会被触发,我可以理解为什么不被触发,但是有没有办法让cfgElement 析构函数为那些触发?我不能delete他们,因为他们不是指针。
我可以将cfgSegment 的head 元素设为指针,然后在config 构造函数中循环遍历segments[] 数组,分别分配每个cfgElement,但这是唯一的方法吗?
【问题讨论】:
-
delete[] segments;有效吗?在~config()内部没有 for 循环。 -
请学习使用 std::string 代替 char* 和智能指针(即 std::unique_ptr)代替“原始”指针,您的开发生活会更轻松。
-
@roalz 是的,我知道字符串和智能指针更容易使用,但随着我的学习,我想以艰难的方式做事,以便我了解这些问题。
-
@alanlittle 好点,我同意。下次在您的问题中添加该信息可能会更好。
-
@roalz 会的,谢谢。
标签: c++ class destructor