簡體   English   中英

初始化對象時出現分割錯誤

[英]Segmentation fault at initializing the object

Class vector
{
    int *v ;
    int size;
    public:

    vector(int m ) // create a null vector
    {
        v=new int[size = m];
        for(int i=0;i<size;i++)
            v[i]=0;
    }

    vector(int *a) //create a vector from an array
    {
        for(int i=0;i<size;i++)
            v[i]=a[i];
    }

    int operator*(vector &y) //scalar product
    {
        int sum=0;
        for(int i=0;i<size;i++)
            sum+=this->v[i]*y-v[i];
        return sum;
    }
}; 


int main()
{
    int x[3]={1,2,3};
    int y[3]={4,5,6};
    vector v1(3); //create a null vector of 3 integers
    vector v2(3);
    v1=x; //create v1 from the array x
    v2=y;

    int R=v1*v2;
    cout<<”R=”r;
    return 0;
} 

執行完上面的程序后,我此時遇到分段錯誤(“ v1 = x”;)可以請任何人解釋為什么我遇到分段錯誤。

int*構造vector ,您無需設置size但可以訪問其值。 此構造函數用於從int*隱式轉換為分配所需的vector 訪問未初始化的值將導致程序具有未定義的行為。 size最有可能具有某些值,從而有效地導致了一些不可訪問的內存被訪問。

您已將作業的左側設置為特定大小的事實無濟於事。 如果您定義自己的從int*vector的賦值, 可能會有所幫助:

vector& vector= (int* other) {
     // ...
}

使用此賦值運算符(當然,使用合適的實現)可以避免從int*vector的隱式轉換,並且您可以使用左側的size

到目前為止,這不是唯一帶有您的代碼的程序:

  • 您分配內存,但從不釋放它。 如果在構造函數中分配內存,則需要一個析構函數來釋放內存。
  • 當然,一旦執行此操作,您將容易地多次釋放內存,因為您沒有副本構造函數或副本分配,並且編譯器生成的版本將進行平面復制。

問題出在您的內存分配方式上。 讓我們只看這四行:

vector v1(3); //create a null vector of 3 integers
v1=x; //create v1 from the array x

在第一行中,使用vector(int m)構造函數形式創建了一個新對象v1。 這里,在堆上分配了一個新的int數組。

在第三行中,創建了一個新對象,替換了在行1中分配的對象。問題開始了,因為此行使用了既不分配v數組也不設置大小的vector(int * a)構造函數變量。 因此,您將輸入復制到未分配的地址,這會導致堆棧錯誤。 此外,您永遠不會釋放在第一行的構造函數中分配的內存。

代碼的其他問題:在*運算符中,將int與向量相乘

sum += this->v[i] * y - v[i];
                  ^^^

盡管未定義此乘法運算符。

該行也不會編譯:

cout<<”R=”r;

首先是因為“ R =”和r之間缺少<<,然后是因為奇怪。

暫無
暫無

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

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