Dyanamic Array Class, программа работает хорошо, но с ошибкой

Это мой код

#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) время выполнения: несколько секунд.

Просто не понял, где я иду не так.

3

Решение

У вашего кода есть несколько проблем.

Например, у вас есть фиксированный массив размером 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:: префикс в заголовочных файлах.

Более того, если вы хотите напечатать содержимое класса в выходной поток, вы можете принять класс как постоянная ссылка, поскольку экземпляры класса являются входными параметрами (вы наблюдать их и распечатать их содержимое в стрим):

std::ostream& operator<<(std::ostream& os, const IntList& a)
{
....
}
1

Другие решения

Это выглядит плохо:

int arr[0];

Во-первых, C ++ не допускает массивов фиксированного размера нулевого размера. Во-вторых, ваш код, безусловно, нуждается в большем, чем массив нулевого размера.

Как бы вы ни использовали этот код, это неопределенное поведение (UB). UB включает в себя код, вроде бы «отлично работающий».

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector