动态分配内存的向量无法删除最后一个

时间:2013-05-01 14:53:22

标签: c++ vector new-operator delete-operator

在我的代码中,我有一个包含整数的向量。使用第一个循环我创建了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;
}

3 个答案:

答案 0 :(得分:5)

你没有做你认为自己的事。推送到向量的内容是未动态分配ints,而是动态分配ints 的值的副本。

所以在这部分

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

在堆上创建一个值为int的新值delete &list.back(); ,然后将其复制到向量中。所以你做不到

ints
<{1>}上的

你必须得到值的地址这个事实应该告诉你它实际上不是那里的指针。


如果要存储指针,请使用

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.

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为什么你甚至尝试使用new并删除!如果你有一个指针的向量,可能有一些理由使用new,但你有一个int的向量。所以只需将注意力推到你的载体上即可。

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

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

令我惊讶的是新手对新词,删除词,指针等上瘾的方式.C ++比这更容易!