我正在编写一个应用程序,我希望将字符串存储为键,将自定义Object存储为值
multimap<string, owncreatedobject> mymap;
编译运行良好,但在使用函数insert时出现“Segmentation fault” 在运行期间。
mymap.insert(string,myobject); --> Segmentation Error
已经添加了一个copyconstructor一个赋值函数(调用copyconstructor)
关于“分段错误?
的任何想法答案 0 :(得分:1)
查看您为复制构造函数和赋值运算符实现添加的注释,我发现您的赋值运算符实现是错误的。基本上它不是复制任何东西,而是使用语句Filter(f);
,您正在创建一个名为f
的本地对象。你不能像这样调用复制构造函数。我建议你写一个私有的复制方法,并在copy ctor和assignment operator中使用它。
答案 1 :(得分:0)
我假设您正在尝试调用接受value_type
多图的插入版本。在这种情况下,请记住多地图的value_type
是std::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。