3

これは私のコードです

#ifndef INTLIST_H_INCLUDED
#define INTLIST_H_INCLUDED
#include <iostream>
using namespace std;

class intList
{
    int upper_bound;
    int arr[0];
    public:
        intList(){ arr[0] = 0; upper_bound = 0; }
        void append(int x);
        void sort();
        friend ostream & operator << (ostream &, intList&);
        inline int len(){ return upper_bound; }
        inline int &operator [](int x){ return arr[x]; }
    private:
        void increment(int *a, int &l);
        void swap(int &a, int &b);
};

void intList::swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}

void intList::increment(int *a, int &b)
{
    b++;
    a[b] = 0;
}

void intList::append(int num)
{
    arr[upper_bound] = num;
    increment(arr, upper_bound);
}

void intList::sort()
{
    for(int i = 0; i < upper_bound; i++)
    {
        int minLoc = i;
        for(int j = i+1; j<upper_bound; j++)
        {
            if(arr[j] < arr[minLoc])
                minLoc = j;
        }
        if(minLoc != i)
            swap(arr[i], arr[minLoc]);
    }
}

ostream& operator << (ostream & dout, intList &a)
{
    dout << "[ ";
    for(int i = 0; i<a.upper_bound-1; i++)
        dout << a.arr[i] << ", ";
    dout << a.arr[a.upper_bound-1] << " ]";

    return dout;
}

#endif // INTLIST_H_INCLUDED

コードは完全に正常に機能します。しかし、最後にプログラムがクラッシュします。process returned -1073741819 (0xC0000005) execution time : some seconds.

どこが間違っているのかわかりませんでした。

4

2 に答える 2

3

これは見栄えが悪いです:

int arr[0];

まず、C++ では、サイズがゼロの固定サイズの配列を使用できません。第 2 に、あなたのコードにはサイズがゼロ以上の配列が必要です。

このコードを使用すると、未定義の動作 (UB) になります。UB には、「完全に正常に動作する」ように見えるコードが含まれています。

于 2012-11-18T16:04:14.517 に答える
1

あなたのコードにはいくつかの問題があります。

たとえば、サイズが 0 の固定配列があるとします。動的に拡張可能な配列が必要な場合は、次を使用できます。メソッドを使用std::vectorして、ベクターの最後に新しい項目を追加できます (動的にサイズを変更します) push_back():

#include <vector>

// Start with an empty vector
std::vector<int> v;

// Add some items to it
v.push_back(10);
v.push_back(20);
....

また、ヘッダー ファイルにusing namespace std;. このようにして、グローバル名前空間を STL クラスで汚染しますが、これは悪いことです。ヘッダー ファイルでプレフィックスを使用するstd::だけです。

さらに、クラスのコンテンツを出力ストリームに出力する場合は、クラスのインスタンスが入力パラメーターであるため、クラスをconst 参照として取得することをお勧めします (それらを観察し、その内容をストリームに出力します)。

std::ostream& operator<<(std::ostream& os, const IntList& a)
{
   ....
}
于 2012-11-18T16:50:09.457 に答える