C++;中止的内核在执行结束时转储 我对C++很新,目前正在做向量的学校作业。头文件包含满足要求所需的功能的实现。我即将完成该程序,但不幸的是,在其执行结束时,它给出了一条“中止内核转储”消息。我似乎不明白这是为什么。一切都很顺利,直到最后。它是在分配测试期间发出该消息的。我需要你在这方面的专业知识。谢谢大家!
我的输出:C++;中止的内核在执行结束时转储 我对C++很新,目前正在做向量的学校作业。头文件包含满足要求所需的功能的实现。我即将完成该程序,但不幸的是,在其执行结束时,它给出了一条“中止内核转储”消息。我似乎不明白这是为什么。一切都很顺利,直到最后。它是在分配测试期间发出该消息的。我需要你在这方面的专业知识。谢谢大家!,c++,arrays,class,vector,C++,Arrays,Class,Vector,我的输出: ********** TestAssign ********** push_back 10 floats: 0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16) 0 1 2 3 4 5 6 7 8 9 (size=10 capacity=16) Assign: b = a, print a,b 0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16) 0 2 4 6 8 10 12 14 16 18 (siz
********** TestAssign **********
push_back 10 floats:
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
0 1 2 3 4 5 6 7 8 9 (size=10 capacity=16)
Assign: b = a, print a,b
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
Assign: a = a, print a
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
Aborted (core dumped)
学校产出(正确的一项):
头文件(我的实现):
模板
vec
{
私人:
T*v;
整数计数;
国际能力;
公众:
vector(){//默认构造函数
容量=0;
v=零PTR;
计数=0;
}
向量(const vector&b)//复制构造函数
{
计数=b.计数;
容量=b.容量;
v=新T[容量];
对于(int i=0;iv[i]=b.v[i];
}
}
vector(vector&&tmp):v(tmp.v),//移动构造函数
计数(tmp计数),
容量(tmp.容量)
{
tmp.v=nullptr;
}
~vector(){//析构函数
如果(v!=NULL);
{
删除[]v;
v=零;
}
}
无效推回(施工T&T)
{
如果(计数+1>容量)
{
容量=标准::最大值(2*容量,1);
T*newData=新T[容量];
对于(int i=0;i v=rhs.v;
rhs.v=空PTR;
}
归还*这个;
}
模板
朋友无效打印(const vector&s);//朋友打印
朋友无效打印(const vector&s);//如果
//未签名
};
模板
无效打印(常量向量和s)
{
//std::cout问题在于赋值运算符:
vector& operator = (const vector &rhs) //copy assignment
{
v = rhs.v;
return *this;
}
它复制指针v
,而不是复制基础数组(您还忘了复制其他成员,count
和capacity
)
因此,在b=a;
之后,您会在a
和b
中双重释放相同的数组,从而导致segfault
将赋值运算符更改为更像复制构造函数:
vector& operator = (const vector &b) //copy assignment
{
if (this != &b) {
count = b.count;
capacity = b.capacity;
v = new T[capacity];
for (int i = 0; i < count; i++)
{
this->v[i] = b.v[i];
}
}
return *this;
}
除非您需要支持,否则我暂时不考虑移动语义。这似乎是一个很好的时机。尤其是如何使用调试器捕捉“正在运行”的崩溃查找在代码中发生的时间和位置。关于代码还有一些其他要点可能值得一提:例如,复制构造函数复制capacity
元素数,而不是count
元素数。这实际上会导致未定义的行为,因为ifcount
然后您将复制未初始化的数据。您好@rustyx,谢谢您的建议。但是,我现在将其作为输出:0 2.8026e-45 5.60519e-45 8.40779e-45 1.12104e-44 1.4013e-44 1.68156e-44 1.96182e-44 2.24208e-44 2.52234e-44(大小=10容量=16)我按照上面提到的代码进行了操作,得到了上面的输出。是的,这是因为a=a;
没有意义。如果您想将其作为no-op进行支持,赋值操作符需要识别这种情况,并且不要尝试复制任何内容。例如,将其包装在If(this!=&rhs){
Aight,一切都好了。非常感谢大家!
void TestAssign(void)
{
std::cout << "\n********** TestAssign **********\n";
cs150::vector<float> a, b;
std::cout << "push_back 10 floats:\n";
for (float i = 0; i < 10; i++) {
a.push_back(2 * i);
b.push_back(i);
}
Print(a);
Print(b);
std::cout << "Assign: b = a, print a,b\n";
b = a;
Print(a);
Print(b);
std::cout << "Assign: a = a, print a\n";
a = a;
Print(a);
}
vector& operator = (const vector &rhs) //copy assignment
{
v = rhs.v;
return *this;
}
vector& operator = (const vector &b) //copy assignment
{
if (this != &b) {
count = b.count;
capacity = b.capacity;
v = new T[capacity];
for (int i = 0; i < count; i++)
{
this->v[i] = b.v[i];
}
}
return *this;
}
if (v != NULL);
^ here