-2

所以我们有以下代码,它说明了一个“指针数组”(我认为)

main() {
  int *array[3];
  int x = 10, y = 20, z = 30;

  array[0] = &x;
  array[1] = &y;
  array[2] = &z;

  return 0;
}

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

所以我想从这个数组中删除一个成员(即通过 delete 关键字调用它的析构函数并销毁对象,但让指针保持正常。)

如果我的怀疑是正确的,那是不可能的,我唯一的选择是将数组的内容复制到一个新数组(除了我要删除的数组),然后删除前一个数组(作为一个整体及其所有元素),而我将新元素分配给指针array

如果有人能证实或纠正我的怀疑,我将不胜感激,特别是因为“指针数组”这个名称具有误导性。谢谢你。

4

2 回答 2

2

假设你有一堂课Foo

Foo a;

这是Foo 对象的一个​​实例。它是在堆栈上分配的。当它们超出范围时,它将立即被破坏。

如果您希望能够显式销毁您的对象,请在堆上分配它。

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

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

Foo* array[3];

是堆栈上的Foo对象指针数组。它们不指向任何东西,它们是未初始化的。当超出范围时,该数组将被销毁。请记住,它只会破坏作为指针的内容,并且不会尝试释放它们指向的任何内容。

array[0] = new Foo();

该数组现在包含一个指向Foo堆上对象的指针。它还包含 2 个未初始化的指针。如果你放手array超出范围,你将泄漏内存。为了防止这种情况,您必须释放您的Foo对象。

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

将未初始化或已删除的指针设置为 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.
}
于 2012-10-24T04:38:59.230 回答
0

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

  1. 您根本无法删除这些元素(int 或 A),因为它们驻留在堆栈中,而不是在堆中,超出范围时它们将被自动删除;
  2. 删除或移动数组不会像上面已经说过的那样删除它的元素。

至于“擦除数组[1]的内容”,可以通过以下方式完成:

array[1] = NULL;

如果我理解正确的话。

于 2012-10-24T03:08:50.490 回答