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

Dav*_*Bos 2 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;
}
Run Code Online (Sandbox Code Playgroud)

sta*_*ust 5

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

所以在这一部分

list.push_back(*(new int(12)));
Run Code Online (Sandbox Code Playgroud)

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

delete &list.back();
Run Code Online (Sandbox Code Playgroud)

在...上ints.

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


如果你想存储指针,那么使用

vector<int*> list;
          ^^
Run Code Online (Sandbox Code Playgroud)

和推动一样

list.push_back(new int(12));
Run Code Online (Sandbox Code Playgroud)

你可以删除为

delete list.back();
Run Code Online (Sandbox Code Playgroud)

但是就是不要这样做.无需动态分配ints.使用

vector<int> list;
list.push_back(12);
// Nothing needs to be deleted.
Run Code Online (Sandbox Code Playgroud)