阵列的指针和其他东西

Arrays of Pointers and something else

本文关键字:其他 指针 阵列      更新时间:2023-10-16

所以我们有以下代码,其中说明了"指针数组"(我认为)

main() {
  int *array[3];
  int x = 10, y = 20, z = 30;
  array[0] = &x;
  array[1] = &y;
  array[2] = &z;
  return 0;
}

现在,假设不是int s,它们是您创建的对象类的一种类型。

因此,我想从此数组中删除成员(即,通过删除关键字调用其破坏者并将对象销毁,但要使指针保持不错。)

如果我的怀疑是正确的,那是不可能的,而我唯一的选择是将数组的内容复制到新数组(我想删除的一个),然后删除上一个数组(从整体上均具有所有元素),而我将新的阵列分配给指针array

我很高兴有人能确认或纠正我的怀疑,特别是因为"指针的数组"是如此误导。谢谢。

假设您有一个Foo

Foo a;

这是 foo对象的实例。它分配在堆栈上。当它们从范围中脱离时,它将被破坏,。

如果您想明确破坏对象,请在 heap 中分配它。

Foo* a = new Foo(); // Allocated - Constructor called.
delete a; // Freed - Destructor called.

要记住的一个好的规则是,对于每个new,都应该有一个匹配的delete,不再,也不少。在您的示例中,您没有使用new关键字,因此没有地方对于delete关键字。

Foo* array[3];

Foo对象指针的 stack 上的数组。他们什么都没有指出,他们是不启用的。当该阵列不在范围内时,它将被摧毁。请记住,它只会销毁内容的内容,这些内容是指示的,不会试图释放他们指向的任何东西。

array[0] = new Foo();

现在,该数组在堆上保存指向Foo对象的指针。它还包含2个非初始化的指针。如果让array脱离范围,则您将是泄漏内存。为了防止这种情况,您必须释放Foo对象。

delete array[0];
array[0] = NULL;

将您的非专业化或删除的指针设置为无效也是一个好习惯。这样,您可以明确地看到它没有指向。您现在可以执行此类检查:

if(array[0])
{
    // We know there is an object here, since it's not NULL.
    delete array[0];
    array[0] = NULL; // Helps prevent trying to free memory more than once.
}

据我了解您的问题,它的作用是有两个原因:

  1. 您将无法删除这些元素(int或a),因为它们居住在堆栈上,而不是在堆中,它们将在隔离时会自动删除;
  2. 删除或移动阵列不会删除其元素,因为它已经说过上面。

至于"擦除数组的内容[1]",可以通过:

来完成:
array[1] = NULL;

如果我正确理解您。