我试图在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
,那么它会导致这个段的原因是什么。故障?
答案 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;位置(不是您初始化的地图)
也许你拿了一个不再存在的基于堆栈的地图的地址?没有更多代码,我只能猜测。