繁体   English   中英

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

[英]Do I need to delete basic data types in a destructor? C++

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

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

谢谢,乔纳森

没有。

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

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

经验法则是

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

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

当然,有时你必须 delete已经分配但别人指向( 由你分配的,但其他人在使用它 )的东西。

不,您不必手动删除自动变量。 delete你的new

此外,您可以通过智能指针使用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;
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM