c – 如果一个Object从堆中分配动态内存,它是否在对象超出范围时自动解除分配,还是需要析构函数?

作为OOP和动态分配的菜鸟,我不确定我是否正确地构建了问题.无论如何,这是代码.注意构造函数和析构函数.

class Queue
{
    int *array;
    unsigned int siz;//Indicates how many elements are there right now
    public: 
    void push(int);
    void clear();
    void print() const;
    Queue(unsigned int len):array(new int[len]), siz(0) {} /*Constructor
    indicating the maximum length*/
    ~Queue(){delete[] array;}   //Destructor to free the memory
    };
/*End of class definition */
    void somefunction()
    {
        Queue sample(10);  //Allocates memory from heap
        .........
    }
}

Queue类包含一个数组和一个无符号整数,表示存在多少个元素.构造函数采用整数参数(指示元素的最大数量)并在内存中分配空间.代码是否适用于我的目的,无论我是否编写析构函数,但我想了解一些函数创建队列时场景后面发生了什么.

示例本身是一个本地对象,但它从堆中获取内存.因此,当某个函数结束时样本超出范围,如果我的话,分配的内存会发生什么

>编写析构函数
>不要写析构函数

我是否需要编写析构函数以避免内存泄漏?此外,如果我写它,它是自动调用还是我需要以某种方式调用它以确保内存不泄漏?

另外,如果类包含的话,析构函数的作用是什么,例如int array [10];而不是int *数组?我可以跳过它吗?

最佳答案

Do I need to write the destructor to avoid a memory leak?

动态分配使用堆内存,除非您有一个清除该内存的析构函数,否则它不会被释放.所以,是的,你需要在使用堆内存时编写析构函数.

if I do write it, does it get called automatically or do I need to
somehow call it to ensure the memory is not leaked?

当对象超出范围时,将自动调用析构函数.

what happens to the allocated memory if I write the destructor

当代码中有析构函数时,动态分配的内存将被清除,并在对象超出作用域后立即可供操作系统使用.

what happens to the allocated memory if I do not write the destructor

如果代码中没有析构函数,则在关闭程序之前,动态分配的内存不会被清除,操作系统无法使用.

转载注明原文:c – 如果一个Object从堆中分配动态内存,它是否在对象超出范围时自动解除分配,还是需要析构函数? - 代码日志