繁体   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