自注册全局对象

时间:2012-01-26 00:19:33

标签: c++ c++11

我正在开发一个用户应该能够使用静态全局实例的库。这些实例(在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的向量,但显然它们不能那样工作......

1 个答案:

答案 0 :(得分:4)

  1. 您的代码没有泄露。唯一分配内存的是std::vector,它会在销毁时自行清理。
  2. ab在执行结束时被正确销毁并释放。
  3. 您不应delete未使用new分配的内容。
  4. 此外,您依赖v在构建ab之前进行初始化。你应该懒得初始化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您的代码在删除循环并添加了一些调试输出的情况下运行。请注意,两个对象都被正确销毁。