4

所以,我有这种情况,我需要查看一个对象是否在我的 stl 映射中。如果不是,我将添加它。

char symbolName[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
map<string,TheObject> theMap;
if (theMap.find(symbolName)==theMap.end()) {
            TheObject theObject(symbolName);
            theMap.insert(pair<string, TheObject>(symbolName,
                    theObject));
}

当对象不在地图中时,我在以下位置获得核心转储:theMap.find。假设,如果项目不在地图中,它应该返回一个等效于 map::end 的迭代器

这里发生了什么?

海合会:3.4.6

4

10 回答 10

4

为什么不这样做呢?

char symbolName[] = "hello";
theMap.insert(pair<string, TheObject>(symbolName, TheObject(symbolName)));

如果您的地图是 a map<string, TheObject>,那么如果您尝试搜索 NULL,您将获得核心转储:

// This will core dump:
char *symbolName = NULL; // Oops!
theMap.find(symbolName); // Kabang!
于 2009-01-26T20:14:50.620 回答
4

它可能由于多种原因而崩溃。在不知道至少TheObject的构造函数的定义的情况下,我认为我们在很大程度上只能猜测这个问题。到目前为止,您的代码看起来不错,但可以简化:

char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));

如果符号已经被映射,它不会做任何事情,丢弃新的 TheObject 对象。

于 2009-01-26T20:52:44.490 回答
3

在执行 find() 之前检查您的 STL 映射是否为 empty()。在空的 STL 映射上执行 find() 时,一些 STL 实现存在错误。

于 2009-01-26T20:09:56.030 回答
2

顺便说一句,有两种可能的简化。

首先,使用make_pair而不是使用pair构造函数。这意味着您不必明确指定类型参数:

theMap.insert(make_pair(symbolName, theObject));

其次,您可以简单地编写代码,而不是您的代码:

theMap[symbolName] = theObject;
于 2009-01-26T20:16:09.853 回答
2

发布您的真实代码,或者至少是展示您所描述行为的完整示例。有时,当您尝试调试只是为了在这样的论坛上发布而编写的虚构代码时,问题会在翻译中丢失。

于 2009-01-26T20:37:45.940 回答
1

这段代码应该可以正常工作。

唯一可能的问题是在 TheObject 实现内部,但它不应该影响 find 调用。

此外,可能是一些不相关的问题,例如由于之前执行的某些代码导致的缓冲区溢出。

于 2009-01-26T20:09:01.350 回答
1

作为代码简化的补充:

使用 std::string 而不是 char[] 并在 TheObject 的类定义中使用它。

不确定您的 TheObject 类正在使用 char 数组做什么,但如果您在此函数范围之外使用地图,例如。通过将其用作返回值,我敢打赌在某处有一个对象指向 symbolName 的地址,该地址不再被定义。

于 2009-01-26T22:10:45.690 回答
0

我不知道你为什么会得到核心转储;该代码对我有用。

有机会使您的代码更简单、更具可读性:

  • 正如其他人指出的那样,您可以将插入简化为theMap[symbolName] = TheObject(symbolName)

  • 我可能错了,但据我所知 { 'a', 'b', '\0' } 与 "abc" 相同,因此您可以简化为char symbolName[] = "Hello";我认为非惯用定义令人困惑这里有些人。

于 2009-01-26T20:56:23.157 回答
0

检查您是否在构造函数中使用它。在构造函数中使用 map 时我遇到了类似的问题。

于 2009-05-06T21:06:19.980 回答
0

我通过使用指向我的地图对象的指针来解决我的问题。由于在构造函数中使用,它们需要是指针,然后在构造函数中我对它们进行了新的操作。

于 2009-05-06T21:20:00.180 回答