0

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

这是主要的:

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

2 回答 2

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它并获取它的地址。看看零长度数组什么时候可以?

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

于 2013-10-10T15:24:54.270 回答
2
nelem = 0;
adr = new T[nelem];

在这里,您分配了一个大小为零的数组,稍后在您的程序中您尝试访问超出该大小的值。

默认构造函数应该将数组设置为 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])
{ }
于 2013-10-10T15:25:50.427 回答