четверг, 11 апреля 2019 г.

Как обрушить программу на C++

Пытаемся выйти за пределы массива и получить segfault:
int *p = new int[3];
p[100] = 100;

Компилируем g++. Ничего не происходит. А все потому, что тут undefined behaviour, компилятор имеет право разбираться с проблемой как хочет. Вот тут об этом подробно (Accessing an array out of bounds gives no error, why?).

Делим на 0:
int x = 1/0;
Опять ничего! Программа компилируется, запускается.

Попробуем создать массив из минус одного элемента:
int *p = new int[-1];

Компилятор проглатывает без проблем. Но при запуске получаем исключение bad_alloc. Ура! Программа грохнулась!

вторник, 2 апреля 2019 г.

std::set - как с ним работать?

Множество обладает свойством уникальности элементов. Как же там хранить какие-то сложные типы данных, как будут сравниваться элементы на равенство? Оказывается, в типе элементов просто нужно перегрузить оператор< . Вот простейший пример:

class mPair
{
        int x, y;
        public:
                mPair(int a, int b)
                {
                        x = a; y = b;
                }

                bool operator<(const mPair &p) const
                {
                        return x

                }
};

Оператор < обязательно должен быть оформлен именно таким образом - константный и с константным аргументом.

Кстати, вот статья с крайне подробным разбором std::set.