簡體   English   中英

重載運算符時發生SIGSEGV錯誤=

[英]SIGSEGV error when overloading the operator=

    _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繼續移動。h,第167行,代碼:swap(_Tp&__a,_Tp&__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依次調用副本分配運算符。 因此,您將獲得操作員的遞歸調用。 您應該為將定義對象的每個數據成員的類定義自己的交換函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM