9

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

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

谢谢,乔纳森

4

6 回答 6

23

不。

但不仅适用于基本类型。对于您没有分配给您的任何东西,您new都不必调用delete即使是指针

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

经验法则是

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

当然,有时您将不得不delete使用尚未分配但指向是否不再需要的东西(由其他人分配但您是唯一使用它的人)。

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

于 2013-04-18T18:55:43.567 回答
4

不,您不必手动删除自动变量。只有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;
}
于 2013-04-18T18:55:47.797 回答
3

不,你没有。您只有delete使用new.

于 2013-04-18T18:55:46.463 回答
3

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

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

于 2013-04-18T19:02:07.853 回答
1

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

于 2013-04-18T18:58:41.800 回答
1

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

于 2013-04-18T18:57:24.610 回答