[英]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.