我是否需要删除析构函数中的基本数据类型? C ++

时间:2013-04-18 18:53:56

标签: c++ memory int destructor

如果我的课程看起来像这样:

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值或其他基本数据类型做任何事情?

谢谢, 乔纳森

6 个答案:

答案 0 :(得分:18)

没有。

但不仅仅是基本类型。对于您未使用new分配的任何内容,您无需致电delete即使是指针

delete以某种方式)与成员变量类型无关。重要的是,如果您在构造函数(或类方法中的其他位置)中分配(使用new)。

经验法则是

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

当然有时你必须delete你没有分配的东西,但是如果它不再需要则指向它(由其他人分配,但你是唯一使用它的人)。

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

答案 1 :(得分:5)

不,您不必手动删除自动变量。只有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;
}

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

int本身是你班级的一部分。指针是您班级的一部分。事实上,你班上列出的所有东西都是你班级的一部分。需要注意的是,指针是类的一部分,但指针指向对象不是。这样的指针将被销毁(并且如果相关则调用它的析构函数),但是指针不会。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

您只需删除新内容或删除[]新内容[]。您可能需要查看auto_ptr