程序在调用构造函数时停止运行,c ++

时间:2013-10-10 15:22:42

标签: c++ templates

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

这是主要的:

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

2 个答案:

答案 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])
{ }
相关问题