如何从指向对象的指针向量中删除对象? [复制]
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
,否则数据不会被删除。
最重要的是,new
和 delete
应始终成对书写。
【讨论】:
以上是关于如何从指向对象的指针向量中删除对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章