0

したがって、作成したこの構造体で静的配列を動的に拡張する必要があります (ベクトルを使用できますが、静的配列を使用して要素をコピーするように特別に要求されるため、ベクトルを使用するように求められないでください)。

問題は、セグメンテーション違反が発生し、その理由がわかりません。オブジェクトの新しいインスタンスを作成すると、長さの配列が設定されます (現在、テストするのは 5 です)。次に、配列のサイズを変更するときにこのコードを実行しますが、機能しません。

if (used == (length-1)) {
            length *= 2;
            T* newArr = new T[length];
            for (int i = 0; i < used; i++) {
            newArr[i] = items[i];
            cout << "Copied" << endl;
        }
        items = newArr;
    }

そのため、新しい配列のアドレスにコピーするようで、適切な数のアイテムのみをコピーするようです。Used は追加されたアイテムの数を決定し、 length は配列全体のサイズを保持します。新しい配列を作成するときに、長さが使用される数の2倍になるようにします。アイテムを newArr に割り当てようとすると、セグメンテーション違反が発生するので、そのコードが正しいのか、それともそこでクラッシュしているのか疑問に思っています。私;行ごとにデバッグしようとしましたが、そこで壊れているかどうかはわかりません。

4

2 に答える 2

1

Q: 「ベクターを使用できますが、静的配列を使用して要素をコピーするように特別に要求されるので、ベクターを使用するように求められないでください...」

A: それでは、質問には根本的な欠陥があります;) ベクトルを使用する必要があります;)

本当にインストラクターを楽しませたいのなら、"new" と "delete" の代わりにmalloc(), realloc()andを使うことをお勧めします ;)free()

一方、「newArr[]」を上書きすると、セグメンテーション違反が発生する可能性があります。「使用済み」が長さよりもはるかに大きい場合、「newArr[]」は小さすぎる可能性があります。

推測ですが、デバッガーを使用すると、何が起こっているのかが明確にわかります。

Q: どのコンパイラとデバッガを使用していますか?

于 2013-05-18T03:06:19.173 に答える