初始化对象时出现分段错误

时间:2014-12-23 13:32:56

标签: c++ linux

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”;) 任何人都可以解释为什么我得到分段错误。

2 个答案:

答案 0 :(得分:2)

当您从vector构建int*时,您不必设置size,但您可以访问其值。此构造函数用于从赋值所需的int*vector的隐式转换。访问未初始化的值会导致程序具有未定义的行为。很可能size在某些无法访问的内存中有效地产生了一些值。

您已将分配的左侧设置为具有特定大小这一事实并不起作用。如果您从int*vector定义了自己的作业,可以提供帮助:

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

拥有此赋值运算符(当然,使用合适的实现)将避免从int*vector的隐式转换,您可以使用左侧的size。 / p>

到目前为止,这不是您代码中唯一的程序:

  • 您分配内存但从未发布内存。如果在构造函数中分配内存,则需要析构函数来释放内存。
  • 当然,一旦你这样做,你就可以轻松多次释放内存,因为你没有复制构造函数或复制赋值,而且编译器生成的版本也可以进行平面复制。

答案 1 :(得分:0)

问题在于如何分配内存。我们只看这四行:

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)构造函数,也不是设置大小变量。因此,您将输入复制到未分配的地址,这会导致堆栈错误。此外,您永远不会释放在第一行构造函数中分配的内存。

您的代码存在其他问题: 在* -operator中,将int与向量

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

虽然没有定义这个乘法运算符。

这一行也不会编译:

cout<<”R=”r;

首先是因为缺少&lt;&lt;在“R =”和r之间,然后因为奇怪的“。