重载运算符时发生SIGSEGV错误=

SIGSEGV error when overloading the operator=

本文关键字:SIGSEGV 错误 运算符 重载      更新时间:2023-10-16
    _3DTocka operator=(_3DTocka _3D){
        swap(*this, _3D);
        return *this;
    }
//main()
_3DTocka _3Dx1(5, 9, 2), _3Dx2(_3Dx1); // first one is using constructor, second one copy constuctor and they both have 5,9,2
_3Dx1 = _3Dx2;

_3DTocka是类的名称。代码编译后,程序在运行时立即给出SIGSEGV错误。。IDE转到move.h,第167行,代码:swap(_Tp&__a,_Tp&aamp;__b(

这是一个无限递归。函数swap((的工作原理如下:

void swap(Type & a, Type & b) {
    Type tmp = a;   
    a = b;          -> here it calls your operator=  
    b = tmp;        /
}

您必须将_3D中的所有类属性分配给该

this->a = _3D.a;
this->b = _3d.b;
...

或者,您可以使用memcpy(this, &_3D, sizeof(_3D)),但前提是您的类不包含其他对象,而只包含基本类型。

函数swap依次调用复制赋值运算符。因此,您将得到运算符的递归调用。您应该为将交换对象的每个数据成员的类定义自己的交换函数。