自己的对象作为stl Multimap中的数据

时间:2009-08-27 10:27:46

标签: c++ stl map

我正在编写一个应用程序,我希望将字符串存储为键,将自定义Object存储为值

multimap<string, owncreatedobject> mymap;

编译运行良好,但在使用函数insert时出现“Segmentation fault” 在运行期间。

mymap.insert(string,myobject); --> Segmentation Error

已经添加了一个copyconstructor一个赋值函数(调用copyconstructor)

关于“分段错误?

的任何想法

4 个答案:

答案 0 :(得分:1)

查看您为复制构造函数和赋值运算符实现添加的注释,我发现您的赋值运算符实现是错误的。基本上它不是复制任何东西,而是使用语句Filter(f);,您正在创建一个名为f的本地对象。你不能像这样调用复制构造函数。我建议你写一个私有的复制方法,并在copy ctor和assignment operator中使用它。

答案 1 :(得分:0)

我假设您正在尝试调用接受value_type多图的插入版本。在这种情况下,请记住多地图的value_typestd::pair。然后,试试这个:


mymap.insert(std::make_pair(mystring,myobject));

编辑(在您的评论之后):您的赋值运算符包含错误。您创建一个无用的临时用户。以下是使用 swap idiom 实现的建议。 (请注意,我不知道类成员的类型是什么。假设它们是内置的,例如int。)


void Swap(Filter const& f) //Create a swap member function.
{
  std::swap(SrcNET, f.SrcNET);
  std::swap(SrcPort, f.SrcPort);
  std::swap(DstNET, f.DstNET); 
  std::swap(DstPort, f.DstPort); 
  std::swap(FlowLabel, f.FlowLabel);   
}

Filter& Filter::operator =(Filter f)
{ 
  swap(f); //Swaps the copy created for parameter passing (pass-by-value) above.
  return *this;
} 

答案 2 :(得分:0)

我怀疑你有一个错误的复制构造函数和/或赋值运算符实现。

如果该行

mymap.insert(std::make_pair(mystring,myobject));

崩溃,很可能在'myobject'上执行的某些方法会导致问题。在此代码行中,最有趣的函数是复制构造函数和/或赋值运算符。

你说你已经添加了一个赋值运算符(它调用了复制构造函数),但这听起来很奇怪。通常情况恰恰相反;复制构造函数根据需要分配资源(即内存),然后调用赋值运算符。

更新:阅读完评论后,以下是您的复制构造函数的样子:

Filter::Filter( const Filter &rhs ) {
    // Apparently no resource acquisition like memory allocation is necessary,
    // so just assign the rhs value.
    *this = rhs;
}

这是赋值运算符。请注意它是如何复制值的。您可能根本不需要赋值运算符(或复制构造函数)实现,因为编译器合成的代码适合您的使用。

Filter &Filter::operator=( const Filter &rhs ) {
    SrcNET = f.SrcNET;
    SrcPort = f.SrcPort;
    DstNET = f.DstNET;
    FlowLabel = f.FlowLabel;
    return *this;
}

答案 3 :(得分:0)

我在最后一个小时内捣乱了你的问题,我想我明白了。

尝试在此代码段中使用某些内容:

multimap<string,yourclass const*> mymap
void addtomap(string s,yourclass const* c)
{
   mymap.insert(pair<string, yourclass const*>(s,c));
}
...`addtomap("abc",&z);

在您给出的示例中,您尝试在没有迭代器的情况下插入。用于多图的2元素插入调用的第一个元素是迭代器。这就是你的分段错误的原因以及为什么要使用pair。