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
的左侧。
到目前为止,这不是唯一包含您的代码的程序:
- 您分配了内存但从未释放它。如果您在构造函数中分配内存,则需要析构函数来释放内存。
- 当然,一旦这样做,您将很容易多次释放内存,因为您没有复制构造函数或复制赋值,并且编译器生成的版本执行平面复制。
关于c++ - 初始化对象时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27621431/