c++ - 初始化对象时出现段错误

标签 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”;) 谁能解释一下为什么我会出现段错误。

最佳答案

当您从 int* 构造您的 vector 时,您没有设置 size 但您访问它的值。此构造函数用于从 int* 到赋值所需的 vector 的隐式转换。访问未初始化的值会导致程序出现未定义的行为。 size 很可能具有一些值,从而有效地导致一些无法访问的内存被访问。

您已将作业的左侧设置为具有特定大小这一事实无济于事。如果您定义自己的从 int*vector 的赋值,它可能会有所帮助:

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

有了这个赋值运算符(当然有一个合适的实现)将避免从 int*vector 的隐式转换,你可以使用 size 的左侧。

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

  • 您分配了内存但从未释放它。如果您在构造函数中分配内存,则需要析构函数来释放内存。
  • 当然,一旦这样做,您将很容易多次释放内存,因为您没有复制构造函数或复制赋值,并且编译器生成的版本执行平面复制。

关于c++ - 初始化对象时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27621431/

相关文章:

c++ - vector vector 的快速分配

c++ - 在linux中使用自己的头文件编译并运行c++程序

linux - "locale"在 Mac OS X 和/或其他 Unix/Linux 操作系统上究竟做了什么

java - 导出运行 JavaFX Scene3D 的 X Display

新引用现有文件时linux api重命名行为

c++ - 如何在 SFML 或 OpenGL 中将纹理正确映射到凸多边形?

c++ - 用数组初始化 std::string 的 vector

c++ - Winsock2 监听循环

c++ - 文件 I/O 未读入任何内容

linux - Solr 服务器内存和磁盘空间