Map由字符串作为键和A的对象作为值组成。 来自std :: map / std :: unordered_map的功能clear()不会调用析构函数。 当我想清除地图时,我必须自己进行释放记忆的工作。 它是使用for循环释放内存的唯一方法吗? 码:

#include <iostream>
#include <unordered_map>
class A
{
public:
    A() { std::cout << "A()" << std::endl; }
    ~A() { std::cout << "~A()" << std::endl; }
};
int main ()
{
  std::unordered_map<std::string, const A*> mymap = { {"house",new A()}, {"car", new A()}, {"grapefruit", new A()} };
  //mymap.clear();//won`t call destructor
  for(const auto &i : mymap)
      delete i.second;      //dealocate value
  mymap.clear();            //clear whole object from tha map
}

是否可以更快地执行此操作,例如不使用for循环?

===============>>#1 票数:5 已采纳

是的 使用unique_ptrunique_ptr自动化。

(请注意我如何将const A*转换为std::unique_ptr<const A>

#include <iostream>
#include <memory>
#include <unordered_map>

class A {
public:
    A() { std::cout << "A()" << std::endl; }
    ~A() { std::cout << "~A()" << std::endl; }
};

int main() {
  std::unordered_map<std::string, std::unique_ptr<const A>> mymap;
  mymap["house"] = std::make_unique<A>();
  mymap["car"] = std::make_unique<A>();
  mymap["grapefruit"] = std::make_unique<A>();

  mymap.clear(); // Will call destructor!
}

===============>>#2 票数:3

使用std::unique_ptr的映射,然后将其clear() 或者只是将A对象而不是指针保留在地图中。

  ask by user3455638 translate from so

未解决问题?本站智能推荐: