删除std :: map函数

时间:2017-07-26 21:45:29

标签: c++ pointers stl std stdmap

我正在尝试删除以下地图:

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 ::的指针,为什么我会收到此错误?

这是删除功能图的合适方法吗?

4 个答案:

答案 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即可。第三方面,当地图本身被销毁时,所有内容都会自动销毁。

具有静态存储持续时间的对象(例如地图)会在程序结束时自动销毁,您无法自行删除它们。