【问题标题】:Following program is throwing an error related memory access以下程序抛出与内存访问相关的错误
【发布时间】:2013-11-27 18:38:47
【问题描述】:

/这个程序正在使用模板类。我不知道为什么,但是这个程序在运行时引发了与内存访问冲突相关的错误。在下面的 cmets 中,我将解释是哪一行导致了这个错误。/

#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;
    }

【问题讨论】:

    标签: c++ templates generics


    【解决方案1】:

    看来问题出在这个构造函数上

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

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

    【讨论】:

      【解决方案2】:

      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);
      

      【讨论】:

        【解决方案3】:

        构造函数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];
        }
        

        【讨论】:

          【解决方案4】:

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

          换句话说,当涉及到类型int[] = vector&lt;int&gt;时,编译器不知道v1=x是什么意思。

          你没有在那里调用重载的构造函数。所以你要么需要调用它vector&lt;int&gt; v1(y);,要么实现vector::operator=(const T[] v)

          我希望我的类型是正确的

          【讨论】:

          • 他没有使用std::vector,这是他自己的vector类。
          【解决方案5】:

          当调用有问题的行时,程序正在使用默认赋值运算符,该运算符正在执行导致您违规的操作。你需要自己实现这个,例如,这对我有用:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-03
            • 2015-12-22
            • 2023-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多