我正在尝试删除以下地图:
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-&gt; second必须是指针类型。在typdef中,'func'是指向myClass ::的指针,为什么我会收到此错误?
这是删除功能图的合适方法吗?
答案 0 :(得分:4)
你在这里误解了一些概念。您使用delete
/ delete[]
来释放已分别由new
/ new[]
分配的内存。
在这里,您有一个std::map
存储指向成员函数的指针值。使用new
在堆上没有分配内存,因此您根本不必使用delete
释放内存。
除此之外,您不需要对每个元素使用std::map::clear()
。相反,您可以使用https://github.com/eligolding/react-mailcheck
清除std::map
,或者让std::map
的析构函数自动释放内容。
答案 1 :(得分:2)
你不能delete
成员指针,因为它是类实例的一部分。
您尚未在myMap
添加元素的位置发布代码,但此类代码无法在new
类型的某些内容上创建func
的成员指针,这表示delete
错误,因为每个delete
必须与new
匹配。
您只需致电myMap.clear()
即可删除myMap
的内容。
答案 2 :(得分:1)
在我尝试删除此地图时,我试图删除指向成员函数的指针
语言不允许这样做。您只能在对象指针上调用delete
。
想一想。
int (*fptr)(const char *lhs, const char *rhs ) = &std::strcmp;
// Does it make any sense at all?
// What would you expect the run time to do with this?
delete fptr;
您的功能非常简单。你可以清理地图。
void deleteMap()
{
map.clear();
}
答案 3 :(得分:1)
有时指针可能会引用不同类型的指针作为一个整体,但通常情况下,特别是在这种情况下,它特别指的是数据指针。您的指针是成员函数指针,因此它不是编译器所指的指针类型。
只有数据指针可以传递给delete
运算符,否则程序格式不正确。更具体地说,您只能传递new
运算符返回的指针值。换句话说,delete
用于释放已使用new
分配的动态内存。
new
运算符永远不能返回(成员)函数指针,因此new
可能无法返回函数指针。
这是删除功能图的合适方法吗?
没有。您无法“删除”地图指向的功能。
map::erase
从映射中删除函数指针,但在删除迭代器之后递增该迭代器具有未定义的行为。因此,无法像在您尝试的那样简单地实现循环中的擦除。
如果要删除所有指针,只需调用map::clear
即可。第三方面,当地图本身被销毁时,所有内容都会自动销毁。
具有静态存储持续时间的对象(例如地图)会在程序结束时自动销毁,您无法自行删除它们。