如何在c ++中检查地图是否为空?

时间:2015-03-05 13:15:56

标签: c++ segmentation-fault stdmap

我试图在c ++中检查地图是否为空。但是,虽然地图不是NULL,但我得到了分段错误。代码很简单,在这里:

void func(std::map<std::string, std::vector<Foo*> >* myMap){
   if(myMap == NULL)
      std::cout << "My map is Null" << std::endl;
   else if(myMap->empty())
      std::cout << "My map is empty" << std::endl;
}

参数有时可能是未初始化的地图。当我执行此代码时,结果是分段错误。代码会跳过if语句,因为它没有将myMap视为NULL地图。然后,它在myMap->empty()命令中崩溃。当我尝试调用地图的任何功能时,它也会崩溃,例如清除,开始,大小等。因此,如果myMap不是NULL,那么它会导致这个段的原因是什么。故障?

2 个答案:

答案 0 :(得分:4)

默认情况下,指针不会设置为NULL,因此调用者可能会使用垃圾信息作为参数。 以下用法示例将崩溃:

std::map<std::string, std::vector<Foo*> >* m;
func(m);

这将编译,但会在m指向某些垃圾时崩溃。 使用null设置指针更安全:

std::map<std::string, std::vector<Foo*> >* m = NULL;
func(m);

并将按计划运作。

我建议您按值或按引用传递参数,但不能通过指针传递参数(删除*):

void func(std::map<std::string, std::vector<Foo*> > myMap){

答案 1 :(得分:1)

需要更多代码才能确定,但​​如果myMap不为零,则可能指向错误的&#39;位置(不是您初始化的地图)

也许你拿了一个不再存在的基于堆栈的地图的地址?没有更多代码,我只能猜测。