Добавление элементов вне выделенного массива?

0

У меня есть класс Set:

class Set
{
public:
    //Default constructor
    Set ();

    //Some more functions...

private:
    int *p;
    const int K = 10;
    int numval = 0; //Number of ints in the array

    //Other variables...
};

Конструктор по умолчанию:

Set::Set()
{
    p = new int[K]; //Allocate memory for array with 10 ints
}

Если бы я в какой-то другой функции заполнил массив 10 ints, а затем добавил другой, что произойдет? Компилятор не сбой, и я могу распечатать 11: th int. Но так как я не выделял для нее память, где он хранится?

Пример:

Set1 += 5;

Добавил бы 5 к массиву со следующим перегрузчиком оператора.

const Set& Set::operator+=(const int x)
{
    p[numval] = x; //Add next int after the last int in the array
    numval++; //Increment number of ints
    return *this;
}
  • 1
    За пределами доступа к массиву неопределенное поведение, точка. Если вы этого не делаете, это должно быть хорошо. Конечно, я должен упомянуть, что вы должны использовать вместо него std::vector .
  • 0
    В вашем коде есть ошибка. Исправьте ошибку, и тайна исчезнет.
Показать ещё 2 комментария
Теги:
arrays

2 ответа

3
Лучший ответ

Если бы я в какой-то другой функции заполнил массив 10 ints, а затем добавил другой, что произойдет?

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

Но так как я не выделял для нее память, где он хранится?

Он не хранится нигде, в смысле наличия для него хранилища. Там просто нечего прекратить писать в произвольные ячейки памяти за пределами массива. Будьте осторожны, чтобы этого не было.

1

Память компьютера является линейной. Это одна огромная строка ячеек (байтов). Каждая ячейка имеет 2 соседства (за исключением первого и последнего, очевидно). Выделение памяти - это просто акт, говорящий "эта часть моя". Это действительно не более, чем обещание: вы обещаете не писать за пределами своего заговора, и взамен вы получите обещание, что никто еще не напишет в нем. Итак, что происходит, когда вы пишете за пределами выделенной области? Вы нарушаете свое обещание. Там может быть кто-то другой сюжет рядом с вашим, может быть неиспользуемое пространство. Ничего на самом деле не происходит, когда вы пишете вне своей области. Реальная проблема возникает, когда законный хозяин возвращается и пытается забрать то, что он оставил, - и это оказывается чем-то другим, что-то, что вы там положили. (Конечно, возможно, что ваш сюжет лежит рядом с чем-то, что система считает важным. В этом случае OS-станции охраняют границу, и они стреляли, чтобы убить всех нарушителей в поле зрения.)

Это ваша работа программиста, чтобы ваша программа обещает. Когда процессы нарушают свои обещания, могут произойти или не произойти плохие вещи - с ними или с другими процессами.

  • 0
    В вашем ответе много неверных утверждений. 1-й из всех "компьютерная память является линейной"
  • 1
    @ πάνταῥεῖ Я думаю, очевидно, что мое объяснение является большим упрощением. Однако, пожалуйста, уточните, как компьютерная память нелинейна, особенно, как это имеет значение при работе с массивом в 10 дюймов.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню