【发布时间】:2018-01-02 10:14:56
【问题描述】:
我正在尝试删除以下地图:
typedef bool (myClass::*func)(std::vector<std::string> &args);
typedef std::map<std::string, func> myMap;
myMap map; //map of functions in the class 'myClass'
void deleteMap()
{
for(myMap::iterator it = map.begin(); it != map.end(); ++it)
{
delete it->second; //compiler says it->second is non-pointer type
map.erase(it);
}
}
'map' 将字符串映射到类 'myClass' 中的函数,并且该函数在其参数中采用字符串向量。
在我尝试删除此映射时,我试图删除指向成员函数的指针,然后擦除迭代器本身。编译器说 it->second 必须是指针类型。在 typdef 'func' 中是指向 myClass:: 的指针,那么为什么会出现此错误?
这是删除函数映射的适当方法吗?
【问题讨论】:
-
你做了新的成员函数?
-
为什么要在指针上调用 delete?
-
看来删除该地图的正确方法是退出该函数。
-
即使没有编译错误,显示的代码也是有缺陷的,并且保证在递增删除的迭代器后由于未定义的行为而导致崩溃。
-
您正试图删除代表
myClass的成员函数的内存。只需花点时间思考一下这其中的含义!delete仅适用于在堆上动态分配的内存,(成员)函数都在内存的静态只读部分。永远不要尝试删除函数指针。使用erase或clear清空地图就足够了
标签: c++ pointers stl std stdmap