【问题标题】:C++ How to Trigger Class DestructorC++如何触发类析构函数
【发布时间】: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他们,因为他们不是指针。

我可以将cfgSegmenthead 元素设为指针,然后在config 构造函数中循环遍历segments[] 数组,分别分配每个cfgElement,但这是唯一的方法吗?

【问题讨论】:

  • delete[] segments; 有效吗?在 ~config() 内部没有 for 循环。
  • 请学习使用 std::string 代替 char* 和智能指针(即 std::unique_ptr)代替“原始”指针,您的开发生活会更轻松。
  • @roalz 是的,我知道字符串和智能指针更容易使用,但随着我的学习,我想以艰难的方式做事,以便我了解这些问题。
  • @alanlittle 好点,我同意。下次在您的问题中添加该信息可能会更好。
  • @roalz 会的,谢谢。

标签: c++ class destructor


【解决方案1】:

您只需要删除段而不是删除循环中的每个对象。

   ~config() {
         delete[] segments;
   }

【讨论】:

  • 嗯,我以为我之前尝试过,编译器抱怨 deleteing 一个数组。但是,您的解决方案可以像宣传的那样工作。谢谢!
  • delete 适用于单个对象,delete[] 适用于数组。实际上这两种变体都应该可以工作,但是数组上的delete 会导致内存泄漏。
  • 实际上,我之前在main() 中尝试的只是int x[5]; delete[] x;,编译器显示[Warning] deleting array 'x'。我不确定有什么区别,把它放在析构函数中;据我所知,它本质上是一回事。啊——没关系,我看到了区别。 segments[] 确实是动态分配的。
  • @GoverNator “实际上这两种变体都应该工作,但删除数组会导致内存泄漏”。假的和假的。 delete 仅适用于 newdelete[] 仅适用于 new[]。将它们与错误的对应物一起使用会导致未定义的行为。
  • @bolov 我的意思是,它会编译并成功运行,但不正确。
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多