我看了很多非常相似的问题,但我仍然无法解决这个问题。
考虑简单类:
class Obj
{
public:
Obj(int moose);
~Obj();
private:
int* val;
};
Obj::Obj(int num)
{
val = new int;
*val = num;
}
Obj::~Obj()
{
printf("Cleanup");
delete val;
}
现在我想要一个指向 objs 的指针 vector 。来源详细说明了问题:
int main(int argc, const char * argv[])
{
std::vector<Obj*> objs;
Obj* o = new Obj(10);
objs.push_back(o);
objs.erase(objs.begin() + 0);
// should have been deleted by now - I want the destructor to have been called
// I have tried delete objs[0], casting to it and then deleting it.
return 0;
}
Obj 中的析构函数仅在程序结束时调用。我希望在从 vector 中删除对象时调用它。
澄清:我正在尝试使用 vector 中的引用删除对象。我不能让它这样做。我知道 vector 不会释放内存。它只是从 vector 中删除引用。谁能提供删除对象并使用 vector 中的引用调用析构函数的代码。
编辑:
即使在添加之后:
auto it = objs.begin() + 0;
delete *it;
objs.erase(it);
如建议的那样,Obj 的析构函数不会触发。
最佳答案
正如许多评论指出的那样,vector.erase
仅从 vector 中删除元素。它不会尝试删除任何关联的内存。
要显式删除关联内存,您需要:
int main(int argc, const char * argv[])
{
...
auto it = objs.begin() + i;
delete *it;
objs.erase(it);
}
实际上,在你的情况下:
int main(int argc, const char * argv[])
{
std::vector<Obj*> objs;
Obj* o = new Obj(10);
objs.push_back(o);
auto it = objs.begin();
delete *it;
objs.erase(it);
}
您的代码还有许多其他不一致之处,并且您尝试做的事情有更好的解决方案,例如:
使用
vector<Obj>
:int main(int argc, const char * argv[]) { std::vector<Obj> objs; objs.emplace_back(10); auto it = objs.begin(); objs.erase(it); }
如果您需要动态分配您的对象,但出于某种原因不想让 vector 处理它,您可以使用
shared_ptr
。或unique_ptr
,谁将为您处理重新分配:int main(int argc, const char * argv[]) { std::vector<std::unique_ptr<Obj>> objs; objs.emplace_back(new Obj(10)); auto it = objs.begin(); objs.erase(it); }
关于c++ - 从指针 vector 中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548510/