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

C++ 是否需要删除析构函数中的基本数据类型?C++;,c++,memory,int,destructor,C++,Memory,Int,Destructor,如果我有一个类似这样的类: class SomeClass { public: SomeClass(int size) { arr = new int[size]; someInt = size / 10; }; ~SomeClass() { delete [] arr;

如果我有一个类似这样的类:

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
on即使是指针

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

经验法则是

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

当然,有时您必须
删除
您尚未分配但在不再需要时指向的内容(由其他人分配,但您是唯一使用它的人)


当然,有时你必须不要
删除
你已经分配但其他人指向的东西(由你分配但其他人正在使用)。

不,你没有。您只需
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;
}

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

您只需要删除新的内容或删除[]新的内容[]。您可能希望查看您从不删除或新建属于对象一部分的任何内容。这句话立即说明了为什么不针对int执行任何特定操作,而针对指针执行某些操作


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

No——您应该使用
std::vector
,而不是手动分配空间。:)@Jerry,这是一个学校作业,要求我使用一个动态分配的数组作为它的一部分。我还被要求正确地解构课堂上的一切,同时也要记住三五法则。您的示例代码中没有遵循该规则。@chris,由于不熟悉该规则的名称,我查找了它。我只是简单地举了个例子。在我的实际类中,我有一个默认(null)构造函数和一个副本构造函数。我还没有学过移动构造器。如果您想给我发一封邮件,我很乐意阅读您的解释。=)仅仅因为一个类没有分配一些东西,并不意味着它不“拥有”一些在类被销毁时应该删除的东西。@James Yes。对。但这不是他所要求的。我只是想说明它的基本原理。我会编辑它。@Jonathan在这种情况下,您只需删除数组。没别的了。其他的情况我想你需要的时候会注意到的。看我的编辑。@Jonathan是的,没错。删除某些内容的确切时间和位置完全取决于程序的设计。对于基本分配内存,由您决定谁拥有什么,谁负责清理任何给定的资源。大多数情况下,分配某些内容的类确实是负责删除该内容的类。总会有例外,但它们完全在你们的控制之下。谢谢,伙计们。在这篇文章和dascandy的文章之间,我现在觉得很有意义谢谢你澄清这一点。我认为现在明确销毁指向对象的需要对我来说更有意义。我会给你们答案,但我认为用户的答案更能回答我的问题。但是有一个+1。=)我同意这两种情况,并且肯定地说,使用向量可以简化我试图做的事情——但这是关于一个类赋值,在这个类赋值中,两种解决方案都是禁止的。我需要显式解构数组,不能使用向量=P@Jonathan如果不允许您使用
std
设施,您可以尝试自己创建一个简单的实现。如果没有这些助手,手动管理资源是很难做到的。我认为这项作业的主要目的之一是了解解构器以及适当的内存分配和管理(至少在小范围内)。除此之外,我不需要再次使用它,但我需要证明我理解它。否则,相信我,我会更乐意使用向量是的,但我的意思是,通过开发助手组件,您可以了解到这一点;除非您的程序只需要管理一件事,否则编写助手组件并多次使用它比多次复制助手的逻辑更容易。如果你的程序只管理一个指针,那没关系。我只需要管理这个程序中的一个指针。将来,当我需要管理更多时,我将能够使用向量。
class SomeClass {
    public:
        SomeClass(int size)
          : arr (size)
          , someInt = size/10;
        {};

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