【发布时间】:2013-11-23 16:44:03
【问题描述】:
我有一个要删除的指针向量,但是遍历该向量并为每个元素调用delete 非常慢。有更快的方法吗?
不幸的是,我确实需要存储指针,因为我使用的是虚拟超类。简化后,类结构如下所示:
class VirtualSuperClass
{
protected:
SomeType m_someMember;
// ...
public:
virtual void doSomething() = 0;
};
class Subclass_1 : public VirtualSuperClass
{
protected:
SomeType m_someSubclassMember;
// ...
public:
virtual void doSomething() { /* do something*/ }
};
class Subclass_2 : public VirtualSuperClass
{
protected:
SomeType m_someOtherSubclassMember;
// ...
public:
virtual void doSomething() { /* do something else*/ }
}
在我的 main 方法中,我填充超类的指针向量,并为每个元素调用函数 doSomething()。
int main()
{
std::vector<VirtualSuperClass*> vec;
vec.push_back(new Subclass_1());
vec.push_back(new Subclass_2());
vec.push_back(new Subclass_2());
vec.push_back(new Subclass_1());
// and so on, about 40,000 elements (not really done with .push_back :) ) ...
// this actually runs in an application loop
for (size_t i = 0; i < vec.size(); i++)
{
vec[i]->doSomething();
}
// ...
for (size_t i = 0; i < vec.size(); i++)
{
delete vec[i]; // <-- pretty slow for large number of elements
vec[i] = NULL;
}
vec.clear();
return 0;
}
【问题讨论】:
-
如果你存储
shared_ptr<VirtualSuperClass>而不是指针,那么编译器会为你处理这个问题。 -
@JonathanPotter:但是速度不会慢,我认为这就是问题所在。
-
如果你的向量在下一行超出范围,那么在
delete之后调用clear()并设置指向NULL的指针是没有意义的。只需执行deletes(或使用智能指针,不要)并返回。
标签: c++ pointers vector stl stdvector