类似于析构函数的命名空间

时间:2016-11-15 18:34:31

标签: c++ namespaces

是否存在类似于析构函数的东西,但对于namespace?我有几个名称空间,每个都有一些特定的功能,有些还有自己的特定变量。我理解将这些变量定义为static会将其范围限制在命名空间的特定用途,例如调用NamespaceA::function(),但是当我打电话给NamespaceB::function()时,它们会以某种方式被销毁(删除,清除等)吗?

同样,我调用NamespaceA::function()并使用NamespaceA::vector,然后我需要调用NamespaceB::function(),并使用其NamespaceB::vector。现在我有两个向量占用内存,当我只需要一个时,用于当前的命名空间。有没有办法可以自动清除未使用的变量,类似于析构函数在类中的作用?请注意,调用命名空间是用户的心血来潮,不知道调用哪个类,以及何时调用。

我想要这个的原因是,可能有些矢量我不想无用地闲逛,吃掉内存,即使它们不是GB数据。

1 个答案:

答案 0 :(得分:1)

不,c ++中没有这样的语言构造,比如namespace广泛的析构函数。

您拥有的选项是在namespace中使用特殊函数,这些函数用于初始化和释放namespace中明确保存为全局变量的占用资源:

namespace Mine {
    A* someGlobalResource = nullptr;

    void init() {
         someGlobalResource = new A();
    }
    void freeResources() {
         delete someGlobalResource;
         someGlobalResource = nullptr;
    }
}

int main() {
    Mine::init();

    // Do works

    Mine::freeResources();
}

另一种解决方案当然是在命名空间中创建一个帮助器类,并在构造函数/析构函数中隐藏这些函数调用:

部首:

namespace Mine {
    class MyNameSpace {
    public:
         MyNameSpace();
         ~MyNameSpace();
    private:
         static std::atomic<bool> initialized = false;
    };
}

翻译单位:

namespace { // Hide the functions in an anonymous namespace
    void init() {
         someGlobalResource = new A();
    }
    void freeResources() {
         delete someGlobalResource;
         someGlobalResource = nullptr;
    }

    A* someGlobalResource = nullptr;
}

namespace Mine {
     MyNameSpace::MyNameSpace() {
         if(!initialized) {
             MyNameSpace::init();
         }
     }
     MyNameSpace::~MyNameSpace() {
         freeResources();
     }
}

并像

一样使用它
int main() {
    Mine::MyNameSpace initHelper;

    // Do works
} // initHelper's destructor is called here
相关问题