如何破坏数组

时间:2009-12-10 08:20:59

标签: c++ arrays

#include <cstdlib>
#include <iostream>

using namespace std;

const unsigned long MAX_SIZE = 20;
typedef int ItemType;

class Heap {
private:
        ItemType array[MAX_SIZE];
        int elements; //how many elements are in the heap
public:
      Heap( )
       ~Heap( )
       bool IsEmpty( ) const
      bool IsFull( ) const
      Itemtype Retrieve( ) 
      void Insert( const Itemtype& )
};

假设我将此作为我的头文件。在我的实现中,做Heap()构造函数和~Heap()析构函数的最佳方法是什么。

我有

Heap::Heap()
{
   elements = 0;
}

Heap::~Heap()
{
   array = NULL;
}

我想知道在这种情况下这是否是破坏和构造数组的正确方法。

7 个答案:

答案 0 :(得分:8)

array未动态分配,因此当范围中的对象不再存在时,它的存储空间消失。实际上,您无法重新分配到array;这样做是错误的。

答案 1 :(得分:2)

在dtor中没有什么需要做,所以你不需要写一个。数组对象的内存未动态分配。因此,当Heap对象超出范围时,为array分配的内存将自动释放。

答案 2 :(得分:2)

C ++中有两种类型的数组:静态和动态。它们之间的主要区别在于如何分配它们的内存。静态数组或多或少地由编译器自动创建和销毁。动态数组需要由程序员创建和销毁。您的对象当前使用静态数组,因此您无需担心其创建或销毁。

但是,如果要将数组切换为动态数组,可以按如下方式更改代码:

typedef int ItemType;
ItemType *array;  // Pointer to location in memory where the array will reside.

Heap::Heap()
{
    array = new ItemType[MAX_SIZE];  // Assign memory for the array to use.
    elements = 0;
}

Heap::~Heap()
{
   delete[] array;  // Clear the memory used by the array.
}

答案 3 :(得分:1)

由于您的数组是静态分配的(即,不使用new),因此析构函数实际上不需要执行任何操作 - 只要创建的堆超出范围(或者如果创建它就显式删除)动态地)数组将消失。

仅在动态分配内存时(例如,在C代码的情况下使用newmalloc()),您需要明确删除(或free())它。

答案 4 :(得分:1)

原始示例中的数组是Heap类的子对象。它由Heap构造函数自动构造,并由Heap析构函数自动销毁。你不需要做任何事来构造和/或破坏它。

答案 5 :(得分:0)

您不必销毁数组,因为它被值使用并且仅使用值(int)。

答案 6 :(得分:0)

如果将typedef更改为基于指针的类型,则应删除该数组的每个ItemType。

因此,您可以遍历数组并删除它们

for ( int i = 0; i < elements; i++ )
  delete array[i] // Supposing you created them with new