这是我第一次使用模板,由于某种原因我的程序停止运行,并显示一条消息,指出“问题导致程序无法正常工作”。我真的不知道是什么原因造成的。

这是主要的:

class point
{
    int x;
    int y;
public:
    point(int abs=0,int ord=0)
    {
        x=abs;
        y=ord;
    }
    ~point(){}
};


模板:

template <class T>
class tablo
{
    T *adr;
    int nelem;
public:
    tablo();
    ~tablo();
    T nouvo(T);
    T & operator [](T);
};

template <class T>
tablo<T>::tablo()
{
    nelem=0;
    adr=new T[nelem];
}

template <class T>
tablo<T>::~tablo()
{
    delete[] adr;
}

template <class T>
T tablo<T>::nouvo(T var)
{
    return adr[nelem++]=var;
}

template <class T>
T & tablo<T>::operator[](T var)
{
    return[T]
}


主要:

#include <iostream>
#include "point.h"

void main()
{
    tablo<point> tab;

    point a(1,2);
    point b(3,4);

    tab.nouvo(a);
    tab.nouvo(b);
}

最佳答案

您要在此处创建一个大小为零(!)的数组:

template <class T>
tablo<T>::tablo()
{
    nelem=0;
    adr=new T[nelem];
}


您访问它并在此处写出超出范围的内容:

template <class T>
T tablo<T>::nouvo(T var)
{
    return adr[nelem++]=var;
}


尝试访问动态分配的零大小数组都是未定义的行为,这意味着几乎可以安全地做的就是在其上调用delete并获取其地址。见when is a zero length array OK?

普通数组的大小不会神奇地增长。您可以使用std::vector<point>代替tablo或作为其一部分来简化所有操作。

10-08 07:54
查看更多