是否存在类似于析构函数的东西,但对于namespace
?我有几个名称空间,每个都有一些特定的功能,有些还有自己的特定变量。我理解将这些变量定义为static
会将其范围限制在命名空间的特定用途,例如调用NamespaceA::function()
,但是当我打电话给NamespaceB::function()
时,它们会以某种方式被销毁(删除,清除等)吗?
同样,我调用NamespaceA::function()
并使用NamespaceA::vector
,然后我需要调用NamespaceB::function()
,并使用其NamespaceB::vector
。现在我有两个向量占用内存,当我只需要一个时,用于当前的命名空间。有没有办法可以自动清除未使用的变量,类似于析构函数在类中的作用?请注意,调用命名空间是用户的心血来潮,不知道调用哪个类,以及何时调用。
我想要这个的原因是,可能有些矢量我不想无用地闲逛,吃掉内存,即使它们不是GB
数据。
答案 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