如何在c++中检查指向映射的指针是否为null

how to check that a pointer to a map is null or not in c++?

本文关键字:映射 指针 是否 null c++ 检查      更新时间:2023-10-16

我正试图使用指向映射的指针来检查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到底是什么?)。