Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何销毁数组_C++_Arrays - Fatal编程技术网

C++ 如何销毁数组

C++ 如何销毁数组,c++,arrays,C++,Arrays,我想知道在这种情况下,这是否是销毁和构造数组的正确方法。您不必销毁数组,因为它由值使用,只使用值(int)。无需在dtor中执行任何操作,因此无需编写一个。数组对象的内存不是动态分配的。因此,当堆对象超出作用域时,为数组分配的内存将自动释放。数组不会动态分配,因此当对象不再存在于作用域中时,它的存储将消失。事实上,您不能重新分配到数组;这样做是错误的。如果将typedef更改为基于指针的类型,则应删除数组中的每个ItemType 因此,您可以遍历数组并删除它们 Heap::Heap() {

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

您不必销毁数组,因为它由值使用,只使用值(int)。

无需在dtor中执行任何操作,因此无需编写一个。数组对象的内存不是动态分配的。因此,当
对象超出作用域时,为
数组
分配的内存将自动释放。

数组
不会动态分配,因此当对象不再存在于作用域中时,它的存储将消失。事实上,您不能重新分配到
数组
;这样做是错误的。

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

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

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

Heap::~Heap()
{
   array = NULL;
}
for(int i=0;i
由于数组是静态分配的(即,不使用
new
),析构函数实际上不需要做任何事情-一旦创建的堆超出范围(或者如果是动态创建的,则显式删除),数组就会消失


只有在动态分配内存时(例如,对于C代码,使用
new
malloc()
),您才需要显式删除(或
free()
)它。

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

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

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

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

你说的破坏是什么意思?把它归零?或者你的意思是取消分配?如果您指的是后者,则不必这样做,因为此数组将在堆栈上分配,并在调用Heap dtor时解除分配。它可以在堆栈上分配,也可以不分配。这完全取决于堆实例的创建方式。没错,我应该更准确地说,“当堆实例超出范围/被释放时,数组将自动释放”变量“array”将在类被销毁后消失,因此没有理由在析构函数中将其赋值为NULL;除非有东西在析构函数中访问它,并且如果您使用“new”将实现更改为动态分配数组,那么以后您需要执行以下操作:delete[]array;答案有错吗?我很想听听否决票的原因。这在技术上是不正确的。数组对象是在为Heap类实例分配的内存块中创建的。因此,只有在堆栈上分配堆实例时,才会在堆栈上创建数组对象。如果实例是在堆上分配的,数组对象将在该块中。可能我使用的术语堆栈有点松散。我的意思是数组对象的内存没有动态分配,因此不需要显式内存管理。当封装对象被释放时,它将自动清理。这似乎在该站点上非常频繁,一个问题的第一个或第二个答案要么被接受,要么被投票支持率高于其他答案——这似乎是因为它比其他答案来得更快。那么“在堆栈上”在那里做什么呢?为什么“在堆栈上”?数组成员是
对象不可分割的一部分。无论在哪里创建
对象,它都会被创建,而不一定是“在堆栈上”(不管这意味着什么)。“数组是在堆栈上静态分配的”-这在技术上是不正确的。数组对象是在为Heap类实例分配的内存块中创建的。因此,只有在堆栈上分配堆实例时,才会在堆栈上创建数组对象。如果实例是在堆上分配的,那么数组对象将在该块中。啊,很好。不过,这并没有真正改变答案的实质——当对象被销毁时,数组将被销毁(如果对象是静态分配的,则会超出范围;如果对象是动态分配的,则会被显式删除/释放()),因此不需要析构函数。静态数组将具有程序的生存期。请记住,静态分配不同于自动分配和动态分配。传递参数时不使用术语“按值”吗?也许你的意思是正确的,但我发现你的答案不清楚。我的意思是“按值”,当访问它时不是“按引用”,即直接访问字段的值。创建/构造/分配数组,而不是“分配”。你不能在C++中分配数组哦,而且数组不是静态的。它是一个非静态类成员。阐明,C++中只有一种数组。有不止一种存储方式。阵列的功能不取决于其所在位置;只有它的一生。函数中声明的数组在执行离开函数之前是活动的。动态数组在解除分配或程序终止之前一直处于活动状态。
for ( int i = 0; i < elements; i++ )
  delete array[i] // Supposing you created them with new
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.
}