1

単純なメモリ マネージャーで使用するには、自分で動的配列を実装する必要があります。

struct Block {       
    int* offset;
    bool used;
    int size;
    Block(int* off=NULL, bool isUsed=false, int sz=0): offset(off), used(isUsed), size(sz) {}
    Block(const Block& b): offset(b.offset), used(b.used), size(b.size) {}
};

class BlockList {
    Block* first;
    int size;
public:
    BlockList(): first(NULL), size(0) {}
    void PushBack(const Block&);
    void DeleteBack();
    void PushMiddle(int, const Block&);
    void DeleteMiddle(int);
    int Size() const { return size; }
    void show();
    Block& operator[](int);
    Block* GetElem(int);
    void SetElem(int, const Block&);
    ~BlockList();
};

オーバーロードする必要がありoperator[]ます。

Block& BlockList::operator\[\](int index) {
    try {
        if (index >= size)
            throw out_of_range("index out of range");
        else 
            return (first[sizeof(Block)*index]);
    }
    catch(exception& e) {
        cerr << e.what() << endl;
    }
}

void BlockList::PushBack(const Block& b) {
    if(!size) 
        first = new Block(b);
    else {
        Block* temp = new Block[size + 1];
        int i = 0;
        for (i = 0; i < size; i++) 
            temp[sizeof(Block)*i] = this->operator[](i);
        delete []first;
        temp += sizeof(Block);
        temp->offset = b.offset;
        temp->size = b.size;
        temp->used = b.used;
        first = temp;
    }
    size++;
}

最初の要素をプッシュするために使用PushBackすると、問題なく動作しますが、2 番目、3 番目、... になると、プログラムはクラッシュしませんでしたが、予期しない結果が表示されるだけです。

配列の内容を取得する方法は次のとおりです。

void BlockList::show() {
    for (int i = 0; i < size; i++) {
        Block current(operator[](i));
        cout << "off: " << current.offset << " size: " << current.size << endl;
    }
}
4

2 に答える 2

3

firstBlockポインターであるため、 indexのみを渡す必要があります。

最初にブロック*します。...

first[0] //returns the first element
first[1] //returns the second element

あなたの例では、最初にインデックスを作成するときに大きすぎるインデックス値を渡しています。これは、内部で sizeof を使用しているためです。

修正されたコード:

Block& BlockList::operator[](int index) {
    try {
        if (index >= size)
            throw out_of_range("index out of range");
        else 
            return (first[index]);//<--- fix was here
    }
    catch(exception& e) {
        cerr << e.what() << endl;
    }
}
于 2009-02-28T13:50:14.643 に答える
1

配列はその要素の大きさを知っているので、 で計算する必要はありませんsizeof(Block)iインデックスとして使用するだけです。

関連して、C++ FAQ Liteには、あらゆる種類の便利な機能をカバーする演算子のオーバーロードに関する優れたセクションがあります。

于 2009-02-28T13:52:45.527 に答える