Sequence s1 = Sequence();
Создает два Sequence
объекта.Первый создан Sequence()
.Второй создается (путем копирования-построения) Sequence s1
.Или, другими словами, этот эквивалент:
const Sequence &temp = Sequence();
Sequence s1 = temp;
Sequence s1
не создает ссылку на объект.Создает объект .Полностью сформирован.Вы можете сделать:
Sequence s1;
s1.show();
И это прекрасно.
Если вы хотите вызвать конструктор не по умолчанию, просто сделайте это:
Sequence s2(3,"s1");
Чтобы понятьОткуда возникла проблема, посмотрите на эту версию:
const Sequence &temp = Sequence();
Sequence s1 = temp;
Вы создаете Sequence
объект.Это заставляет конструктор выделять массив с new
.Fine.
Вторая строка принимает временный объект Sequence
и копирует в s1
.Это называется «назначение копирования».
Поскольку вы не определили оператор назначения копирования, это означает, что C ++ будет использовать алгоритм копирования по умолчанию.И это просто байтовая копия (она также запускает назначение копии членам класса).Таким образом, вместо того, чтобы Sequence
вызывать свой конструктор, он получает данные, скопированные в него из временного temp
.
Вот проблема.В исходном коде временный, который вы создаете с помощью Sequence()
? уничтожается , когда это утверждение заканчивается.Он существует достаточно долго, чтобы его содержимое можно было скопировать в s1
, затем он уничтожен .
Уничтожение означает, что вызывается его деструктор.Его деструктор удалит массив.
Теперь подумайте о том, что произошло.Временный появился и выделил массив. указатель на этот массив был скопирован в s1
.Затем временный объект был уничтожен, в результате чего массив был освобожден.
Это означает, что s1
теперь содержит указатель на освобожденный массив .Вот почему голые указатели плохи в C ++.Вместо этого используйте std::vector
.
Кроме того, не используйте инициализацию копирования подобным образом.Если вы просто хотите Sequence s1
, создайте его просто:
Sequence s1;