0

我真的被困在尝试使用 delete 释放内存而不是在 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;

我试过 delete[] 数组,但它不起作用。

代码必须保持原样,因为它被要求做的事情是正确的。唯一的事情是添加一个删除(单行而不是 for 循环)来删除 Array。

4

7 回答 7

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++ 具有自动资源管理功能,您应该使用它们。在这种情况下,最好使用 a 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它被摧毁时,它会清理一切。

于 2012-05-24T16:34:56.447 回答
6

运算符delete[]必须与new[]您未在此处使用的运算符一起使用。您手动 new编辑了MyClass. 您必须手动 delete处理MyClass.

于 2012-05-24T16:33:27.190 回答
5

delete[]用于删除由 分配的new[]内容,它不会调用delete数组的每个元素。delete您必须在循环中调用每个数组元素。

于 2012-05-24T16:33:31.463 回答
4
std::vector<std::unique_ptr<MyClass>> Array;
Array.resize(10);

无需删除。

于 2012-05-24T16:34:08.193 回答
0

我真的被困在尝试使用 delete 释放内存而不是在 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++ 功能。如果不需要,请不要使用它们。

于 2012-05-24T16:44:26.433 回答
0

您可以使用像这样的删除器仿函数并执行以下操作:

for_each(Array.begin(), Array.end(), free_ptr<C>());
于 2012-05-24T18:58:18.470 回答
-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;
于 2012-05-24T16:55:25.610 回答