【问题标题】:Do I need to delete basic data types in a destructor? C++我需要删除析构函数中的基本数据类型吗? C++
【发布时间】:2013-04-12 00:56:21
【问题描述】:

如果我有一个看起来像这样的类:

class SomeClass {
    public:
        SomeClass(int size) {
                     arr = new int[size];
                     someInt = size / 10;
                    };
        ~SomeClass() {
                      delete [] arr;
                      //do I need to somehow delete the int value 'someInt'?
                     };
    private:
        int *arr; //pointer to dynamically allocated array
        int someInt;
}

究竟应该在析构函数中包含什么以避免内存泄漏?

我知道我需要删除数组,因为它是动态分配的,但我需要对 int 值或其他基本数据类型做任何事情吗?

谢谢, 乔纳森

【问题讨论】:

  • 否 - 您应该使用 std::vector 而不是手动分配空间。
  • @Jerry,这与学校作业有关,我需要使用动态分配的数组作为其中的一部分。我还需要正确解构课堂上的所有内容。
  • 也要牢记三五法则。您的示例代码中没有遵循它。
  • @chris,不熟悉规则的名称 - 我查了一下。我只是把它放在一起作为一个简单的例子。在我的实际类中,我确实有一个默认(空)构造函数和一个复制构造函数。我还没有学过移动构造函数。如果您想 PM 给我,我会很乐意通读解释。 =)

标签: c++ memory int destructor


【解决方案1】:

没有。

但不仅限于基本类型。对于您没有使用new 分配的任何内容,您不必调用delete即使是指针

delete不知何故)与成员变量类型无关。重要的是您是否在构造函数中(或在类方法中的其他位置分配了它(使用new)。

经验法则是

Have as many delete as new
Have as many delete[] as new[].

当然,有时您必须delete 一些您尚未分配但指出是否不再需要的东西(由其他人分配,但您是唯一使用它的人) .

当然,有时您必须 delete拥有分配但其他人指向的东西(由您分配但其他人正在使用它)。

【讨论】:

  • 仅仅因为一个类没有分配一些东西,并不意味着它没有'拥有'在类被销毁时应该删除的东西。
  • @James 是的。真的。但这不是他要问的。我只是想说明它的基础知识。我会编辑它。
  • @Jonathan 在这种情况下,您只需删除数组。而已。其他情况我认为您会在需要时注意到它们。查看我的编辑。
  • @Jonathan 是的,没错。删除某些内容的确切时间和地点完全取决于程序的设计。对于基本分配的内存,由您决定谁拥有什么,以及谁负责清理任何给定的资源。大多数情况下,分配某些东西的类确实是负责删除它的类。总是有例外,但它们是什么完全在你的控制之下。
  • 谢谢,伙计们。在这篇文章和 dascandy 的文章之间,现在对我来说很有意义。 =)
【解决方案2】:

不,您不必手动删除自动变量。只有deletenew

此外,您可以通过智能指针使用 RAII 来避免删除数组。然后您不必手动定义析构函数;自动定义的析构函数会做你需要的。

class SomeClass {
    public:
        SomeClass(int size)
          : arr {new int[size]}
          , someInt = size/10;
        {};

    private:
        std::unique_ptr<int[]> arr; //pointer to dynamically allocated array
        int someInt;
}

最好使用更专业的类型,例如std::vector,而不是通用智能指针:

class SomeClass {
    public:
        SomeClass(int size)
          : arr (size)
          , someInt = size/10;
        {};

    private:
        std::vector<int> arr;
        int someInt;
}

【讨论】:

  • 我同意这两种情况,并且绝对是使用向量会简化我正在尝试做的事情这一事实 - 但这是关于禁止您的两种解决方案的班级分配。我需要显式解构数组,并且不能使用向量。 =P
  • @Jonathan 如果不允许您使用std 设施,您可以尝试自己创建一个简单的实现。没有这样的帮助者手动管理资源是很难做到的。您甚至可以通过这种方式了解更多信息。
  • 我认为这项作业的主要目的之一是了解解构器以及正确的内存分配和管理(至少在小范围内)。除了这种情况,我不需要再次使用它,但我确实需要证明我理解它。否则,相信我,使用向量我会更开心。 =)
  • 对,但我的意思是你可以通过开发辅助组件来学习;除非您的程序只需要管理一件事,否则编写辅助组件并多次使用它比多次复制辅助组件的逻辑更容易。如果你的程序只管理一个指针,那没关系。
  • 我只需要管理这个程序中的一个指针。以后当我需要管理更多的时候,我就可以使用向量了。
【解决方案3】:

不,你没有。你只有delete 使用new 分配的内容。

【讨论】:

    【解决方案4】:

    您永远不会删除或新建属于您的对象的任何内容。这句话立即表明了为什么你不为 int 做任何特定的事情,而是为指针做一些事情。

    int 本身就是你的类的一部分。指针是你的类的一部分。事实上,您班级中列出的所有内容本身就是您班级的一部分。需要注意的一点是 pointer 是您的类的一部分,但 pointeepointed-at 对象 不是。这样的指针将被销毁(并调用其析构函数,如果相关),但指针不会。

    【讨论】:

    • 感谢您澄清这一点。我认为现在明确销毁指向对象的需要对我来说更有意义。我会给你答案,但我认为用户的回答更能准确地回答我的问题。不过有一个+1。 =)
    【解决方案5】:

    没有。 someInt 按值存储并使用自动存储时长。一旦它所属的对象被销毁someInt 并且所有其他具有自动存储持续时间的成员变量也被销毁。您仍然负责管理您已经完成的具有动态存储持续时间(新建/删除)的对象。

    【讨论】:

      【解决方案6】:

      你只需要删除你新的或删除[]你新的[]。你可能想看看auto_ptr

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2017-06-02
        • 2011-12-13
        • 1970-01-01
        • 2010-09-06
        • 2016-09-24
        • 1970-01-01
        • 2020-12-25
        • 2020-11-17
        相关资源
        最近更新 更多