我有一个矢量指针的静态映射:
static std::map<type, std::vector<object *> > m_objects;
在这种情况下我该如何删除条目?
答案 0 :(得分:4)
如果m_objects
拥有object
指向的std::vector
,那么必须在delete
的{{1}} object
调用std::vector
,或者使用智能指针,该指针会在object
被破坏时自动删除std::vector
(在这种情况下从map
中删除时):
static std::map<type, std::vector<std::unique_ptr<object>>> m_objects;
如果object
不属于m_object
s,则不得调用delete
(因为它们在别处使用)。
答案 1 :(得分:1)
迭代地图中的每个条目,对于每个条目,迭代向量中的每个条目并删除它们。
for (auto it : m_objects) {
for (auto ptr : it.second) {
delete ptr;
}
}
更好的解决方案可能是使用std::unique_ptr
或std::shared_ptr
。
答案 2 :(得分:1)
更好的解决方案是not to use a vector of raw pointers并利用C ++ 11完美转发
#include <iostream>
#include <map>
#include <memory>
#include <vector>
using namespace std;
struct object {
};
enum type {
TYPE0,
TYPE1
};
typedef std::map<type, std::vector<std::unique_ptr<object> > > long_type;
static long_type m_objects;
int main() {
std::vector<std::unique_ptr<object>> vec;
vec.push_back(std::move(std::unique_ptr<object>(new object))); // make_unique in C++14
m_objects.insert(std::pair<type, std::vector<std::unique_ptr<object>>>(TYPE0, std::move(vec)));
long_type::iterator it = m_objects.find(TYPE0);
m_objects.erase(it);
cout << m_objects.size(); // 0
return 0;
}
通过这种方式,您不必担心在每个已分配的对象上调用delete
(地图不会单独执行此操作)。