Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;中止的内核在执行结束时转储 我对C++很新,目前正在做向量的学校作业。头文件包含满足要求所需的功能的实现。我即将完成该程序,但不幸的是,在其执行结束时,它给出了一条“中止内核转储”消息。我似乎不明白这是为什么。一切都很顺利,直到最后。它是在分配测试期间发出该消息的。我需要你在这方面的专业知识。谢谢大家!_C++_Arrays_Class_Vector - Fatal编程技术网

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
元素数。这实际上会导致未定义的行为,因为if
count
然后您将复制未初始化的数据。您好@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