如何根据大小修复“分段错误(核心已转储)”

时间:2019-04-13 16:40:37

标签: c++11

我创建了一个类“ config”,其中包含12个布尔值,以std :: array进行组织。该类具有返回双精度值的“结冰”功能。 尝试使用我编写的谓词通过std :: sort(包含在#include中)通过std :: sort命令订购2 ^ 12(4096)配置的向量,但出现分段错误错误。

将向量缩小到205(而不是1)可以消除该错误,但是我不知道为什么。 如果我将向量设为4096长,并尝试仅对一小部分进行排序,则它将起作用直到该部分长到175+。 将向量缩小到例如1000左右,可以在给出分段误差之前将部分排序限制在20左右。

make_unique

我希望代码能对向量进行排序,但会遇到分段错误。

1 个答案:

答案 0 :(得分:0)

您的程序在sort函数中具有未定义的行为,因为您的谓词按值获取config,因此将进行复制并在此位置调​​用复制构造函数,该复制构造函数仅复制数组val,但是不是g

bool pred (config c1, config c2){ return c1.icing()>c2.icing(); } 
//         takes by value, copy ctor is called 
config (const config& fro): val(fro.val){}; // only val is copied, g HAS GARBAGE VALUE
// icing in pred uses g !! - stric weak ordering is violated because g has GARBAGE VALUE

修正1: 通过const config&传递配置:

bool pred (const config& c1, const config& c2){ return c1.icing()>c2.icing(); }

或修复2: g在副本构造函数中初始化:

config (const config& fro): val(fro.val), g(fro.g){};