动态数组类,程序运行良好,但有错误

时间:2012-11-18 16:02:38

标签: c++

这是我的代码

#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

守则完美无缺。但最终程序崩溃了。给出一些错误 进程返回-1073741819(0xC0000005)执行时间:几秒钟。

只是没弄到我错的地方。

2 个答案:

答案 0 :(得分:3)

这看起来很糟糕:

int arr[0];

首先,C ++不允许零大小的固定大小数组。其次,您的代码肯定需要的不仅仅是零大小的数组。

您对此代码的任何使用都是未定义的行为(UB)。 UB包含看似“完美无缺”的代码。

答案 1 :(得分: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)
{
   ....
}