У меня есть класс 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;
}
Если бы я в какой-то другой функции заполнил массив 10 ints, а затем добавил другой, что произойдет?
Вы должны писать в любую память после окончания массива, вызывая неопределенное поведение: возможно, не вызывает очевидных проблем, возможно, искажая некоторые несвязанные данные (или метаданные, используемые для управления кучей), или, возможно, сбой, если не было доступной для записи памяти там.
Но так как я не выделял для нее память, где он хранится?
Он не хранится нигде, в смысле наличия для него хранилища. Там просто нечего прекратить писать в произвольные ячейки памяти за пределами массива. Будьте осторожны, чтобы этого не было.
Память компьютера является линейной. Это одна огромная строка ячеек (байтов). Каждая ячейка имеет 2 соседства (за исключением первого и последнего, очевидно). Выделение памяти - это просто акт, говорящий "эта часть моя". Это действительно не более, чем обещание: вы обещаете не писать за пределами своего заговора, и взамен вы получите обещание, что никто еще не напишет в нем. Итак, что происходит, когда вы пишете за пределами выделенной области? Вы нарушаете свое обещание. Там может быть кто-то другой сюжет рядом с вашим, может быть неиспользуемое пространство. Ничего на самом деле не происходит, когда вы пишете вне своей области. Реальная проблема возникает, когда законный хозяин возвращается и пытается забрать то, что он оставил, - и это оказывается чем-то другим, что-то, что вы там положили. (Конечно, возможно, что ваш сюжет лежит рядом с чем-то, что система считает важным. В этом случае OS-станции охраняют границу, и они стреляли, чтобы убить всех нарушителей в поле зрения.)
Это ваша работа программиста, чтобы ваша программа обещает. Когда процессы нарушают свои обещания, могут произойти или не произойти плохие вещи - с ними или с другими процессами.
std::vector
.