2016-04-22 42 views
1

下面我使用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 
+1

@bku_drytt这不是一个好主意...... – songyuanyao

+1

根据您的代码,您可以删除由“t1”指向的整个数组。您不能删除数组的各个元素。如果你已经使用了“Test * t1 [5];然后为这5个指针中的每一个指定了内存,那么你可以删除任何元素” – sameerkn

+0

这是未定义的行为。不要这样做。您可以显式调用这些对象的析构函数。使用'new []'分配的空闲内存仅使用delete []' – teivaz

回答

2

的阵列,在其寿命期间,正好包含尽可能多的对象,因为它没有被首次创建时。您不能添加或删除它们。当数组被销毁时,所有包含的对象都将被销毁。

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

1

您无法从数组中删除元素的原因是因为您为此数组分配了一系列内存。你不能释放你分配的一部分。这是全部或没有。分配对象时同样的事情,你不能释放它的一部分。

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