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];

ここでは、サイズがゼロの配列を割り当てており、後でプログラム内でそのサイズを超える値にアクセスしようとしています。

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])
{ }
于 2013-10-10T15:25:50.427 に答える