我真的很难尝试使用删除来释放内存,而不是在for循环中。
MyClass *Array[10];
cout << "Step 1 - Allocation" << endl << endl;
Array[0] = new MyClass();
Array[1] = new MyClass();
Array[2] = new MyClass(2, 4.6);
Array[3] = new MyClass(*Array[2]);
Array[4] = new MyClass();
Array[5] = new MyClass(13, 66.6);
Array[6] = new MyClass(75, 9.43);
Array[7] = new MyClass(*Array[6]);
Array[8] = new MyClass(*Array[1]);
Array[9] = new MyClass(*Array[3]);
cout << endl << "Step 2 - Write" << endl << endl;
for(int i=0; i<10; i++)
{
Array[i]->write();
cout << endl;
}
cout << endl << "Step 3 - Deallocation" << endl << endl;
我尝试删除[]数组,但它不起作用。
代码必须保持原样,因为它要求做的正确。唯一的事情是添加一个删除(单行而不是for循环)来删除数组。
答案 0 :(得分:8)
您需要使用new
删除您创建的每个对象:
for (unsigned i(0); i < 10; ++i)
delete Array[i];
Array
本身是一个局部变量;您没有使用new
创建它,因此您不使用delete
来销毁它。当它超出范围时它将被销毁。
为了解决必须完成删除的更新约束“单行而不是for循环”,我想,我可以写一下:
delete Array[0]; delete Array[1]; delete Array[2]; delete Array[3]; delete Array[4]; delete Array[5]; delete Array[6]; delete Array[7]; delete Array[8]; delete Array[9];
这是一行代码,不使用循环。不可能使用单个delete
表达式来销毁十个有效无关的对象。
但不要这样做。真。手动资源管理很危险,很难正确完成。 C ++具有自动资源管理功能,您应该使用它们。在这种情况下,使用std::vector<MyClass>
:
std::vector<MyClass> Array;
Array.push_back(MyClass());
Array.push_back(MyClass());
Array.push_back(MyClass(2, 4.6));
Array.push_back(MyClass(Array[2]));
// Etc.
此示例中没有new
,因此不需要delete
。 std::vector
将在销毁时清理所有内容。
答案 1 :(得分:6)
运营商delete[]
必须与运营商new[]
结合使用,您尚未在此处使用。
您手动 new
编辑MyClass
的每个实例。
您必须手动 delete
每个MyClass
个实例。
答案 2 :(得分:5)
delete[]
用于删除由new[]
分配的内容,它不会为数组的每个元素调用delete
。您必须在循环中的每个数组元素上调用delete
。
答案 3 :(得分:4)
std::vector<std::unique_ptr<MyClass>> Array;
Array.resize(10);
无需删除。
答案 4 :(得分:0)
我真的很难尝试使用删除来释放内存,而不是在for循环中。
如果您不手动分配内存,则无需手动释放内存。
MyClass Array[10] = {
MyClass(),
MyClass(),
MyClass(2, 4.6),
MyClass(Array[2]),
MyClass(),
MyClass(13, 66.6),
MyClass(75, 9.43),
MyClass(Array[6]),
MyClass(Array[1]),
MyClass(Array[3])
};
// there's nothing to delete now
new
或delete
是具有一些利基用途的高级C ++功能。如果您不需要,请不要使用它们。
答案 5 :(得分:0)
您可以使用删除函数,例如this one,并执行以下操作:
for_each(Array.begin(), Array.end(), free_ptr<C>());
答案 6 :(得分:-1)
我能在一行中看到清理的唯一方法是重写它,以便Array是指向对象数组的指针,而不是指针数组。
MyClass *Array = nullptr;
cout << "Step 1 - Allocation" << endl << endl;
Array = new MyClass[10];
Array[0] = MyClass(); //removed "new"
...
cout << endl << "Step 2 - Write" << endl << endl;
for(int i=0; i<10; i++)
{
Array[i].write(); //Objects aren't pointers anymore
cout << endl;
}
cout << endl << "Step 3 - Deallocation" << endl << endl;
delete[] MyClass;