【问题标题】:Delete only specific elements of a dynamically allocated array of structure objects仅删除动态分配的结构对象数组的特定元素
【发布时间】:2016-04-22 10:26:50
【问题描述】:

下面我使用new[] 分配了一个由 5 个结构对象组成的数组,其中只有 3 个用于放置我的数据,其余的我想删除。下面是程序。它会产生最后提到的编译错误。

#include<iostream>

using namespace std;

struct Test
{
        int data;
        Test() { cout<<"struct created"<<endl; }
};
int main()
{
        Test *t1;
        t1 = new Test[5];
        int i,n;
        n=3;
        for(i=0;i<n;i++)
                t1[i].data=(i+10);
        while(i<5)
        {
                delete t1[i];
                i++;
        }
}

编译错误是

error: type ‘struct Test’ argument given to ‘delete’, expected pointer

【问题讨论】:

  • @bku_drytt 这不是个好主意...
  • 根据您的代码,您可以删除“t1”指向的整个数组。您不能删除数组的单个元素。如果您使用了“Test *t1[5]; 然后为这 5 个指针中的每一个分配内存,那么您可以删除任何元素”
  • 这是未定义的行为。不要这样做。您可以为这些对象显式调用析构函数。使用new[] 分配的可用内存仅使用delete[]
  • 简单的答案是你不能从这样的数组中“删除”东西。如果您希望能够动态添加 删除元素,请使用std::vector
  • @teivaz 当数组被删除(或不删除数组并有内存泄漏)时,这不会导致再次执行元素的析构函数吗?

标签: c++ arrays pointers free


【解决方案1】:

数组在其生命周期内包含的对象数量与它最初创建时的对象数量完全相同。您不能添加更多或“删除”它们。当数组被销毁时,所有包含的对象都将被销毁。

如果您想要一个包含可变数量对象的数组,那么您正在寻找std::vector

【讨论】:

    【解决方案2】:

    你不能从数组中删除一个元素的原因是你为这个数组分配了一个内存范围。而且你不能释放你分配的一部分。要么全有,要么全无。当你分配一个对象时,同样的事情,你不能释放它的一部分。

    如果您想从数组中删除对象(不使用 user2079303 所说的 std::vector),您仍然可以使用指针数组。 但是当必须销毁数组时,您必须自己管理每个元素(这似乎不是一个好主意)。

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 2018-06-29
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多