为什么STL将核心转储映射到find?

时间:2009-01-26 19:58:32

标签: c++ gcc map

所以,我有这种情况需要查看对象是否在我的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上获得核心转储。 据说,如果项目不在地图中,则应该返回一个iterator equivelent to map :: end

这里发生了什么?

海湾合作委员会:3.4.6

10 个答案:

答案 0 :(得分:4)

为什么不这样做呢?

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

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

// This will core dump:
char *symbolName = NULL; // Oops!
theMap.find(symbolName); // Kabang!

答案 1 :(得分:4)

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

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

如果已经映射了符号,则不会执行任何操作,从而丢弃新的TheObject对象。

答案 2 :(得分:2)

在执行find()之前检查您的STL映射是否为空()。在空STL映射上执行find()时,某些STL实现会出错。

答案 3 :(得分:2)

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

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

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

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

theMap[symbolName] = theObject;

答案 4 :(得分:2)

发布您的真实代码,或至少展示您所描述行为的完整示例。有时,当您尝试调试只是为了在这样的论坛中发布的伪装代码时,翻译中的问题是微妙的。

答案 5 :(得分:1)

此代码应该可以正常工作。

唯一可能的问题是在TheObject实现中,但它不应该影响查找调用。

此外,可能是一些不相关的问题,例如Buffer overflow,因为之前执行了一些代码。

答案 6 :(得分:1)

作为代码简化的补充:

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

不确定你的TheObject类使用char数组做了什么,但是如果你使用这个函数范围之外的map,例如。通过使用它作为返回值,我敢打赌,某处某个对象指向symbolName的地址,该地址已不再定义。

答案 7 :(得分:0)

我不知道你为什么得到核心转储;该代码适合我。

有机会使您的代码更简单,更易读:

  • 正如其他人所说,您可以将插入简化为theMap[symbolName] = TheObject(symbolName)

  • 我可能错了,但据我所知{'a','b','\ 0'}与“abc”相同,所以你可以简化到char symbolName[] = "Hello";我我认为非惯用的定义会让一些人感到困惑。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我通过使用指向地图对象的指针修复了我的问题。由于在构造函数中使用,它们需要是指针,然后在构造函数中我新建它们。