gpt4 book ai didi

c++ - 删除在C++中静态函数中分配的内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:59:18 26 4
gpt4 key购买 nike

我有如下的 C++ 类

class anotherClass;

class myClass {
private:
myClass() {}
~myClass() {}

typedef std::map<string, anotherClass* > stringToClass;
static stringToClass s_stringToClass;

public:
static anotherClass* getStringToclass(string name);

};

上面类中getStringToClass的定义如下

anotherClass* myClass::getStringToClass(string name) {
stringToClass::iterator iter;
iter = s_stringToClass.find(name);

if(iter == s_stringToClass.end()) {
typedef stringToClass::value_type stringToClassPair;
anotherClass* pothClass = new anotherClass();
s_stringToClass.insert(stringToClassPair(name, pothClass));
return pothClass;
}
else {
return iter->second;
}
}

现在我的问题是我们正在按照上面的定义在静态函数中分配内存。我们怎样才能删除内存?我们可以在析构函数中删除内存吗,因为析构函数不是静态的?

感谢您的帮助。

最佳答案

集合会自动清理,但里面的指针不会,所以你真的有 2 个选择:

  • 使用了将被清理的 shared_ptr 集合
  • 使用存储原始指针但清理它们的集合

在 boost 中有后一种类型的类,但不确定它们是否有用于 map 的类,我会选择前者。

我也会修改结构,这样我就不使用静态函数和静态映射,而是拥有一个带有函数和映射的类,并拥有该类的静态(单例)实例。

您的函数也可以修改为返回一个 shared_ptr,但它仍然可以返回一个常规指针,因为该项目将永远保留在 map 中,因此您无需担心它会失效。

因为它永远不会为 NULL,所以您甚至可以返回一个引用。

   typedef std::map<string, boost::shared_ptr<anotherClass> > stringToClass;
anotherClass& myClass::getStringToClass(string const& name)
{
boost::shared_ptr<anotherClass> & value = s_stringToClass[name];
if( !value )
{
value.reset( new anotherClass );
}
return *value;
}

您也可以考虑使其成为线程安全的。

关于c++ - 删除在C++中静态函数中分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872803/

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