配列にまつわるエラーとその対策

配列範囲超え問題。

配列の範囲を超えてアクセスしても、エラーにはならず、どこか知らないアドレスが勝手に書き換わるという問題。

sstd::vectorの場合

添字ではなく、at()でアクセスすれば、範囲を超えた時に注意してくれるらしい。

自作クラスによる解決法。

このクラスのサイズ8バイト。ちょっと多すぎ。たかだか配列範囲超えチェックのためだけに使う気にはなれない。
しかし、std::vector<int>のサイズは20byte!stdを使うよりかはマシか?

#include <assert.h>
#include <stdio.h>
template<class T> class CArray{
public:
    CArray(int _size){
        mSize=_size;
        mElements=new T[_size];
    }
    int mSize;
    T *mElements;
    T& operator[](int i){
        assert(i>=0 && i<mSize);
        return mElements[i];
    }
    ~CArray(){
        delete mElements;
    }
};
サポートサイト Wikidot.com