【问题标题】:I was just looking template and found this code in my book and this is showing segmantation fault?我只是在看模板,在我的书中找到了这段代码,这显示了分段错误?
【发布时间】:2020-03-21 19:16:39
【问题描述】:

此代码给出了分段错误 在此程序中专门将数组分配给模板时是否调用了构造函数? 请详细解释 如果调用构造函数为什么是分段错误? if not called 这不是语法错误吗

#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 &v){
        T sum=0;
        for (int i=0;i<size;i++)
        {
            sum+=this->v[i]*v.v[i];
        }
        return sum;
    }
    void display(){
        for (int i=0;i<size;i++)
        {
            cout << v[i] <<"\t";
        }
    }

};
int main()
{
    int x[3]={1,3,5};
    int y[3]={2,4,6};
    vector<int> v1;
    vector<int> v2;
    v1=x;
    v2=y;
    v1.display();
    cout<<endl;
    v2.display();
    return 0;
}

【问题讨论】:

  • 这个doesn't even compile 因为using namespace std;。似乎是一本糟糕的书。
  • using namespace std; + class vector 有足够的理由再也不打开这本书了
  • 类的第一个可怕名称,尤其是在整个std命名空间which you shouldn't do中啜饮时。一定要告诉我们书名和作者。我需要知道我的图书馆里是否有这些垃圾。
  • 如果这是一本书的代码,我建议您将这本书重新用于学习 C++ 以外的其他内容。
  • 请发布真实代码,这不会导致段错误,因为它确实not compile

标签: c++ arrays templates constructor runtime-error


【解决方案1】:

除了所有糟糕的代码之外,还有一个问题:

int x[3]={1,3,5};
...
vector<int> v1(x);

调用:

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

因为指针v 尚未分配任何内存。 所以第一次通过for循环:v[0] = a[0];会导致段错误。

【讨论】:

  • 对不起,错误的代码实际上只有vector v1;它导致了同样的错误
  • @SandeepAcharya 没关系。在v1 = x;(和v2 = y)的转换操作期间,仍然会触发相同的有问题的构造函数。不管你喜不喜欢,那个构造函数坏了。
  • 谢谢你,但为什么赋值运算符甚至调用构造函数?
  • @SandeepAcharya 没有定义赋值运算符=(),所以你会得到默认值,这也是错误的。
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多