以下程序正在引发与错误相关的内存访问

Following program is throwing an error related memory access

本文关键字:错误 访问 内存 程序      更新时间:2023-10-16

/此程序使用模板类。我不知道为什么,但这个程序在运行时相关的内存访问违规时抛出了一个错误。在下面的评论中,我将解释是哪一行导致了这个错误/

#include<iostream>
    using namespace std;
    const int size =3;
    template <class t="">
    class vector
    {
        T* v;
    public:
        vector()
        {
            v=new T[size];
            for(int i=0;i<size;i++)>
                v[i]=0;
        }
        vector(T* a)
        {
            for(int i=0;i<size;i++)>
                v[i]=a[i];
        }
        T operator*(vector &y)
        {
            T sum=0;
            for(int i=0;i<size;i++)>
                sum+=this->v[i] * y.v[i];
            return sum;
        }
        void display(void)
        {
            for(int i=0;i<size;i++)>
            {
                cout<<v[i]<<"t";
            }
                cout<<"n";
        }
    };
    int main()
    {
        int x[3]={1,2,3};
        int y[3]={4,5,6};
        vector<int> v1;
        vector <int> v2;
        v1=x; // This is causing an error 
        v2=y; // This is causing an error
        //int R=v1*v2;
        //cout<<"R = "<<R<<"n";
        cout<<"V1 = ";
        v1.display();
        cout<<"V2 = ";
        v2.display();
        cout<<"V1 x V2 = "<<v1*v2;
        return 0;
    }

问题似乎出在这个构造函数中

    vector(T* a)
    {
        for(int i=0;i<size;i++)>
            v[i]=a[i];
    }

您没有为v.所指向的数组分配内存

2问题:

  1. 您没有初始化向量的内存
  2. 你不正确地调用构造函数

修复#1

   vector(T* a)
   {
        v=new T[size];
        for(int i=0;i<size;i++)>
            v[i]=a[i];
   }

修复#2

int x[3]={1,2,3};
int y[3]={4,5,6};
vector<int> v1(x);
vector <int> v2(y);
构造函数vector(T * a)将被调用,而成员v不会被任何东西初始化。这会导致未定义的行为。所以要解决这个问题,你需要在构造函数中进行分配
vector(T* a)
{
    v = new T[size];//this line is new
    for(int i=0;i<size;i++)
        v[i]=a[i];
}

我的猜测是没有为vector定义operator=(int [])

所以换句话说,编译器不知道当涉及到类型int[] = vector<int>时,v1=x是什么意思。

您没有在那里调用重载构造函数。因此,您要么需要将其称为vector<int> v1(y);,要么实现vector::operator=(const T[] v)

我希望我的类型正确

当调用有问题的行时,程序使用默认的赋值运算符,该运算符正在执行导致冲突的操作。你需要自己实现这一点,例如,这对我来说很有效:

T& operator=(T const * a)
{
    for(int i=0;i<size;i++)
        v[i]=a[i];
    return *this;
}