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

您在堆上创建一个int值为 12 的新值,然后将其复制到向量中。所以你不能做

delete &list.back();

ints

您必须获取值的地址这一事实应该告诉您它实际上不是那里的指针。


如果要存储指针,请使用

vector<int*> list;
          ^^

并像推

list.push_back(new int(12));

你可以删除为

delete list.back();

但是,不要这样做。无需动态分配ints。利用

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

当您这样做时,list.push_back(*new int(12));您只需将数字 12 添加到向量中,此操作后&vector.back()不等于new int(12)返回的地址。您可以移至new int(12)上一行,存储结果并验证自己。

我想知道为什么它不会在删除循环的第一次迭代中崩溃。

于 2013-05-01T14:58:07.397 回答
0

你为什么还要尝试使用 new 和 delete!如果你有一个指针向量,可能有一些理由使用 new,但你有一个整数向量。所以只需将整数推到你的向量上。

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

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

新手沉迷于 new、delete、指针等的方式让我感到惊讶。C++ 比这更容易!

于 2013-05-01T14:58:46.213 回答