C++ 为什么STL映射核心转储在find上?

C++ 为什么STL映射核心转储在find上?,c++,gcc,map,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(p

所以,在这种情况下,我需要查看一个对象是否在我的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));
}
char symbolName[]={'H','e','l','l','o','\0'};
地图主题图;
if(theMap.find(symbolName)=theMap.end()){
对象对象(符号名称);
地图插入(成对)(符号名称,
对象);
}
我在:theMap.find上得到一个核心转储,而对象尚未在映射中。 假设,如果该项不在映射中,则应该返回一个与map::end等价的迭代器

这是怎么回事


GCC:3.4.6

此代码应该可以正常工作

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


此外,也可能是一些不相关的问题,比如之前执行的一些代码。

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

为什么不这样做呢

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

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

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

theMap.insert(make_pair(symbolName, theObject));
其次,您可以简单地编写以下代码,而不是编写代码:

theMap[symbolName] = theObject;

发布真实的代码,或者至少发布一个展示您所描述行为的完整示例。有时,当您尝试调试仅为在类似论坛中发布而编写的伪代码时,问题在于翻译过程中丢失了一个微妙之处。

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

char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));
char symbolName[]=“你好”;
地图主题图;
插入地图(配对(symbolName,对象(symbolName));

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

我不知道为什么会有堆芯垃圾;代码对我有用

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

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

  • 我可能错了,但据我所知,{'a','b','\0'}与“abc”相同,因此可以简化为
    char symbolName[]=“Hello”我的印象是,非惯用的定义让这里的一些人感到困惑


作为代码简化的补充:

使用std::string代替char[],并在对象的类定义中使用它



不确定TheObject类使用char数组做了什么,但是如果您在这个函数的作用域之外使用映射,例如,通过使用它作为返回值,我打赌在某个地方有一个指向symbolName地址的对象,它不再定义了。

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

我通过使用指向map对象的指针解决了这样的问题。由于在构造函数中使用,它们需要成为指针,然后在构造函数中我将它们重新命名。

嗯。。。了解对象::对象(??)
是什么会有帮助;不管它是什么?它只是一个被“散列”的对象。映射可以实现为二叉树。它几乎可以肯定是实现为二叉树。它几乎可以肯定是空的。这是个问题吗?为什么?我怀疑这会多久出现一次,但这个线程讨论的是这样的:IIRC,如果映射中不存在键,则使用括号运算符访问STL映射返回NULL或抛出异常——无论哪种方式,赋值的最终结果是得到一个异常。否-如果需要,它将使用默认值构造函数创建条目。@rmeador:否。括号运算符有一个非常重要且被广泛忽略的副作用。这就是为什么没有此运算符的
const
版本的原因,这一事实让人非常恼火。但是,它将覆盖以前存储的任何object对象。如果它有可变的状态,它可能会改变事情。我站在更正,刚刚阅读了文档。。。我也知道我遇到了我在第一次评论中描述的情况。我能想到的唯一解释是,我在映射中使用的类型没有默认构造函数,但我怀疑它是否会编译……但它不起作用。Codelogic提到,如果树开始时为空,可能会出现问题,但我不确定原因。您可以添加Object类的定义吗?你在用什么编译器?我不能添加类的定义。编译器的版本是gcc 3.4.6,如果只插入对象(symbolName),并且该symbolName已经存在对象的实例,那么它将覆盖该实例。不,如果密钥已经存在,则insert不会执行任何操作(在返回对的第二个值中由false指示)+1很好的一个Josh-为什么要写所有额外的代码,当STL将为您做检查
char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));