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