如何在c++中检查指向映射的指针是否为null
how to check that a pointer to a map is null or not in c++?
我正试图使用指向映射的指针来检查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到底是什么?)。
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 智能指针作为无序映射键,并通过引用进行比较
- C++:映射结构中的结构指针
- 如何创建对象函数指针C++映射?
- 整数键映射到头文件中的成员函数指针
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 添加要映射的对象的唯一指针
- 通过指针或引用将映射传递给函数?
- 在映射中存储模板类函数指针
- c++:复制、删除和运算符=在原始指针映射中
- 将唯一指针插入std::映射
- 在循环(C++)中用新指针填充映射
- C++:如何初始化包含具有给定键的指针列表的映射
- 如何将带指针的结构插入到映射中
- 重构MFC消息映射以包括完全限定的成员函数指针
- C 正确的方法来初始化和处理映射指针
- 定义基于模板的映射指针,以便在验证范围时将 int 解析为枚举
- C++中的静态无序映射指针初始化
- 动态分配映射指针值
- 如何在c++中维护映射指针的向量