3

我试图了解如何在内存中删除指针向量和指向的对象。我从一个简单的例子开始,在另一个线程中找到,但我得到“指针被释放没有分配”错误。

我做错了什么?

#include <vector>
#include <algorithm>
#include <iostream>

int main(){
    std::vector <int *> vec;

    int a = 2;
    int * b = &a;

    int c = 3;
    int * d  = &c;

    vec.push_back(b);
    vec.push_back(d);

    for (int i = 0; i < vec.size(); i++) {
        delete vec[i];
    }
    vec.clear();

}
4

3 回答 3

3

仅对使用 new 创建的变量调用 delete 检查此链接: 在堆栈上分配的变量上调用 delete

于 2013-07-07T22:33:30.987 回答
2

您正在使用自动存储释放在堆栈上分配的内存。这就是为什么你会出错。

只有delete你分配的东西newRAII将负责其余的工作。

于 2013-07-07T22:33:42.053 回答
0

当你这样做

int a = 2;

您在堆栈上分配一个 int 并且堆栈上的任何内容都不需要delete,一旦我们离开它声明的范围,它将自动释放。因此,在您的代码中,您试图两次释放相同的东西。

虽然如果你这样做

int* a = new int(2);

然后,您将在堆上分配一个 int,除非您明确调用,否则数据不会被删除delete

底线是,new并且delete应该始终成对书写。

于 2013-07-07T22:43:42.507 回答