gpt4 book ai didi

c++ - 命名空间的类析构函数

转载 作者:行者123 更新时间:2023-11-30 05:20:34 25 4
gpt4 key购买 nike

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

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

我想要这个的原因是可能有一些 vector 我不想无用地闲逛,消耗内存,即使它们不是 GB 的数据。

最佳答案

不,在 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

关于c++ - 命名空间的类析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40617237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com