这是我第一次使用模板,出于某种原因,我的程序停止运行,并显示“导致程序正常工作的问题”。我真的不知道是什么导致了它。
这是主要的:
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);
}
答案 0 :(得分:8)
您在这里创建一个大小为零(!)的数组:
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
或作为{{1}}的一部分来简化所有内容。
答案 1 :(得分:2)
nelem = 0;
adr = new T[nelem];
在这里,您要分配一个零大小的数组,稍后在程序中尝试访问超出该大小的值。
default-constructor应该将数组设置为nullptr,你应该有另一个采用指定大小的构造函数:
template <class T>
tablo<T>::tablo()
: nelem(0), adr(nullptr)
{ }
template <class T>
tablo<T>::tablo(int size)
: nelem(size), adr(new T[size])
{ }