我正试图使用指向映射的指针来检查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()
命令中崩溃。当我试图调用映射的任何函数时,比如clear、begin、size等,它也会崩溃。所以,如果myMap
不是NULL
,它会对这个seg造成什么样的原因。过错
指针默认情况下不会设置为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){
需要更多的代码来确定,但如果myMap
不为零,它可能指向"错误"的位置(而不是您初始化的地图)
也许你取了一个已经不存在的基于堆栈的映射的地址?如果没有更多的代码,我只能猜测。
它会出错,因为您总是需要初始化指针才能使用它们,甚至需要将它们与nullptr进行比较。例如,https://stackoverflow.com/a/32211682/2201117:
取一个未初始化的指针:
int* ptr;//points to any location in memory
取一个空指针:
int* ptr = NULL;//normally points to 0x0 (0)
如果取消引用,两者都会导致未定义的行为。
NULL
通常定义为CCD_ 11。
因此,在您的示例中,您的函数没有任何问题,但您使用的指针有问题:
std::map<std::string, std::vector<Foo*> >* m = NULL;
func(m); // ok, prints "My map is Null"
如果在任何现代C++实现中工作,还应该检查NULL和nullptr之间的区别(nullptr到底是什么?)。