2

私のコードには、整数を保持するベクトルがあります。最初のループを使用して、100 個の新しい整数を作成し、それらをベクトルにプッシュします。最後の整数を削除するとエラーが発生し、0xc0000005 が返されるため、次のループでは、最後の整数を除いて動的に割り当てられたすべての整数が削除されます。最後の整数を削除するとプログラムがクラッシュするのはなぜですか?

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> list;

    cout << list.size() << endl;

    int i = 0;
    while(i!=100)
    {
        list.push_back(*(new int(12)));
        i++;
    }

    cout << list.size() << endl;

    i=0;
    while(i!=99)
    {
        delete &list.back();
        list.pop_back();
        i++;
    }
/*
    delete &list.back();

    list.pop_back();
*/
    cout << list.size() << endl;

    return 0;
}
4

3 に答える 3

5

あなたは自分が思っていることをしていません。ベクトルにプッシュされるのは、動的に割り当てられるのではなく、動的に割り当てられintsた の値のコピーですints

だからこの部分で

list.push_back(*(new int(12)));

値 12の新しいintオン ヒープを作成し、そのをベクターにコピーします。だからあなたはできません

delete &list.back();

ints

値のアドレスを取得する必要があったという事実は、実際にはそこにあるポインターではないことを示しているはずです。


ポインタを保存したい場合は、

vector<int*> list;
          ^^

のように押す

list.push_back(new int(12));

そしてあなたはとして削除することができます

delete list.back();

しかし、それをしないでください。を動的に割り当てる必要はありませんint。使用する

vector<int> list;
list.push_back(12);
// Nothing needs to be deleted.
于 2013-05-01T14:58:34.387 に答える
0

なぜ new と delete を使おうとしているのですか! ポインターのベクトルがある場合、new を使用する何らかの理由があるかもしれませんが、int のベクトルがあります。したがって、intをベクターにプッシュするだけです。

while(i!=100)
{
    list.push_back(12);
    i++;
}

cout << list.size() << endl;
list.clear();

初心者が new、delete、pointers などに夢中になっていることに驚かされます。C++ はそれよりも簡単です。

于 2013-05-01T14:58:46.213 に答える