我正在开发一个用户应该能够使用静态全局实例的库。这些实例(在main之前运行)将自己注册到另一个全局向量中,然后可以使用它......
目前,它有点像这样......
class A;
std::vector<A*> v;
class A {
public:
A (int i) : i(i) {
v.push_back(this);
}
int get () const {
return this->i;
}
private:
int i;
};
A a(1);
A b(2);
int main ()
{
for (A* const& c : v)
std::cout << c->get() << std::endl;
for (std::vector<A*>::iterator i = v.begin(); i != v.end(); i++)
delete *i;
return 0;
}
然而,我担心这段代码会泄漏...当我不希望用户明确地删除向量的内容时(他们会忘记它),它应该会在最后自动发生主要的。
还有其他解决方案吗?我想使用std :: unique_ptr的向量,但显然它们不能那样工作......
答案 0 :(得分:4)
std::vector
,它会在销毁时自行清理。a
和b
在执行结束时被正确销毁并释放。delete
未使用new
分配的内容。此外,您依赖v
在构建a
和b
之前进行初始化。你应该懒得初始化v
(见下文)。
std::vector<A*>& global_v()
{
static std::vector<A*> v;
return v;
}
// use global_v() instead of v in the A constructor.
要获得所需内容,只需删除删除这些对象的循环。
Here's您的代码在删除循环并添加了一些调试输出的情况下运行。请注意,两个对象都被正确销毁。