0

forループにならずに、deleteを使用してメモリの割り当てを解除しようとすると本当に行き詰まりました。

    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 [] Arrayを試しましたが、機能しません。

コードは、要求された内容によって正しいままである必要があります。唯一のことは、配列を削除するために削除(forループではなく単一行)を追加することです。

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];

これは1行のコードであり、ループを使用しません。単一のdelete式を使用して、実質的に無関係な10個のオブジェクトを破棄することはできません。


しかし、これをしないでください。本当に。手動のリソース管理は危険であり、正しく実行するのは非常に困難です。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が破壊されたときにすべてをクリーンアップします。

于 2012-05-24T16:34:56.447 に答える
6

演算子は、ここでは使用していないdelete[]演算子と組み合わせて使用​​する必要があります。のすべてのインスタンスを手動で編集しnew[]まし 。のすべてのインスタンスを手動で行う必要があります。newMyClass deleteMyClass

于 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

forループにならずに、deleteを使用してメモリの割り当てを解除しようとすると本当に行き詰まりました。

手動でメモリを割り当てない場合は、手動でメモリの割り当てを解除する必要はありません。

    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

クリーンアップを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 に答える