Насколько быстро удаляется карта, которая содержит динамически выделенную память в качестве значения?

Карта состоит из строки в качестве ключа и объектов A в качестве значения. Функция clear() из std::map/std::unordered_map не будет вызывать деструктор. Я должен позаботиться о том, чтобы освободить память от себя, когда я хочу очистить карту. Это только один способ освободить память с помощью цикла 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?

2 ответа

Решение

Ага! использование unique_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!
}

Используйте карту std::unique_ptrи просто clear() Это. Или просто подержи A объекты на карте, а не указатели.

Другие вопросы по тегам