Вы столкнулись с неопределенным поведением.
Следующее:
polymerPointer[polymer::count] = new polymer();
polymer::count++;
не эквивалентно
polymerPointer[polymer::count] = new polymer();
, где polymer()
увеличивается polymer::count
.
Неопределенное поведение проистекает из того факта, что вы изменяете значение и используете это значение в том же выражении:
§1.9 p15 Если сторонавлияние на скалярный объект не секвенировано относительно другого побочного эффекта на тот же скалярный объект или вычисления значения с использованием значения того же скалярного объекта, поведение не определено.
Вероятно, происходитчто счетчик увеличивается, а затем объект помещается в эту новую позицию в массиве.Теперь код получит доступ к пустому месту слева, как если бы он содержал действительный указатель, или когда вы доберетесь до конца массива, вы можете попытаться поместить указатель за пределы массива.
Это плохой дизайнпоместить приращение количества в другое место, чем то, где вы фактически вставляете в массив.Вам нужно написать статическую функцию-член, которая добавляет элементы в массив и обновляет счетчик, а затем использует его вместо того, чтобы вручную создавать объект и вручную помещать его в массив, ожидая, что счетчик будет обновляться автоматически.
class polymer {
static void create_new_polymer() {
polymerPointer[polymer::count] = new polymer();
count++;
}
};
Еще лучше было бы просто использовать vector
и управлять им своим собственным счетом:
polymerPointer.push_back(new polymer());