我宣布了矢量:
vector<Object> my_vect;
我将一些物体推入其中,如
my_vect.push_back(*(new Object()));
我知道如果我要声明一个指针向量会很简单,但这对我的代码至关重要。
我尝试使用
my_vect.clear()
但无济于事。
此外,我还尝试获取指向对象的指针,如:
vector<*Object> new_my_vect;
for(int i = 0; i < my_vect.size(); i++)
{
new_my_vect.push_back(&my_vect[i]);
}
for(int i = 0; i < new_my_vect.size(); i++)
{
delete new_my_vect[i];
}
但是我收到了“free(): invalid pointer:
”错误。
感谢-你,
答案 0 :(得分:1)
您应该按如下方式添加对象
vector<Object> my_vect;
my_vect.emplace_back();
或
my_vect.push_back(Object());
我不建议在向量中获取指向对象的指针,就好像导致向量重新分配这些指针的任何东西都会失效,因为底层数组将被复制到别处。
答案 1 :(得分:1)
*(new Object())
这是内存泄漏。它在堆上创建一个新对象,取消引用它,创建一个副本(除非vector :: push_back使用移动语义),然后泄漏堆分配保留的内存。
矢量&lt; *对象&gt; new_my_vect;
for(int i = 0; i&lt; my_vect.size(); i ++) { new_my_vect.push_back(安培; my_vect [I]); }
for(int i = 0; i&lt; new_my_vect.size(); i ++) { 删除new_my_vect [i]; }
这是获取矢量本身存储的对象的地址。绝对保证与传递给向量的对象的地址不一致。矢量可以随意重新分配和重新排列它的内部存储器。只要您不修改向量,只能在向量中获取对象的地址是安全的。使用删除释放此内存无效。
这里的问题在于,您是按值在向量中存储对象而不是按地址存储对象。改为存储指针。这样你可以添加堆分配的对象,然后循环遍历向量并在完成后释放它们。这样它只复制指针,而不是对象。
vector<Object*> objs;
for (int i = 0 ; i < 10 ; ++i) {
objs.push_back(new Object());
}
for (unsigned int i = 0 ; i < vec.size() ; ++i) {
delete objs[i];
}
答案 2 :(得分:1)
这样做
my_vect.push_back(*(new Object()));
结果如下:
在堆上创建对象。
对象的指针被解除引用*(..)并在push_back中作为参数传递。
存储在矢量中时,会创建此对象的副本。
一旦push_back返回,最初创建的Object仍然被分配,没有人能够解除分配,因为它的指针不再存在。因此产生了内存泄漏。
如前所述,如果你需要一个“对象”对象的矢量,你可以传递在堆栈上创建的对象
my_vect.push_back(Object());