如何从指向对象的指针向量中删除对象? [复制]

Posted

技术标签:

【中文标题】如何从指向对象的指针向量中删除对象? [复制]【英文标题】:How to delete objects from vector of pointers to object? [duplicate] 【发布时间】:2013-07-05 05:14:31 【问题描述】:

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

我做错了什么?

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


【问题讨论】:

只有new'd 才会删除。 【参考方案1】:

仅对使用 new 创建的变量调用 delete 检查此链接: Calling delete on variable allocated on the stack

【讨论】:

OK - 所以如果不是 int * 的向量,我有一些 Objects *(由 new 实例化),那么它会起作用吗? @Bibi541 如果您有一个由int* 组成的向量,其中充满了由new 实例化的元素,那么它会起作用。 int* 仅表示“int 的地址”——而不是“对我拥有的 int 的引用”。 @Bibi541,然后你会意识到自己清理它们是一件非常痛苦的事情,尤其是在异常安全方面,而且你会使用智能指针并从此过上幸福的生活。跨度> 【参考方案2】:

您正在使用自动存储解除分配在堆栈上的内存。这就是您遇到错误的原因。

只有delete 分配给new 的东西。 RAII 将负责其余的工作。

【讨论】:

【参考方案3】:

当你这样做时

int a = 2;

你在栈上分配一个 int,栈上的任何东西都不需要delete,一旦我们离开它声明的范围,它就会被自动释放。因此,在您的代码中,您尝试释放相同的东西两次。

如果你这样做了

int* a = new int(2);

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

最重要的是,newdelete 应始终成对书写。

【讨论】:

以上是关于如何从指向对象的指针向量中删除对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

无法从文件复制到指向对象的指针向量

当向量在内部类中时,如何删除指向对象的向量指针

如何从 C++ 中的“指向对象的指针”向量访问对象

C ++在向量迭代中删除并返回指向对象的指针

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?

我是否正确删除了指向对象的向量?