Если у вашего объекта есть какой-либо определяемый пользователем конструктор, он всегда создается с использованием конструктора.Простое определение объекта без аргументов конструктора использует конструктор по умолчанию независимо от того, перезаписывается ли объект впоследствии.То есть
FixedByteStream received;
вызовет конструктор по умолчанию.Следующая строка немного интереснее:
received = FixedByteStream(12);
Эта строка создает временный FixedByteStream
с аргументом 12
.Внутренне это выделит некоторую память, но поскольку временные значения уничтожаются в конце полного выражения (в данном случае, по существу, при достижении точки с запятой), это не принесет вам большой пользы.Как только этот временный объект создан, он присваивается received
с использованием автоматически сгенерированного назначения копирования, которое выглядело бы примерно так, если бы вы написали его вручную:
FixedByteStream& FixedByteStream::operator= (FixedByteStream& other) {
this->existing = other.existing;
this->size = other.size;
this->address = other.address;
return *this;
}
То есть после выполнения этого назначенияВы должны идентичные копии FixedByteStream
, одна из которых собирается быть уничтоженной и высвободит только что выделенные ресурсы.Это явно не то, что вам нужно, т.е. вам определенно нужно реализовать оператор присваивания копирования, чтобы ваш класс хорошо себя вел.В общем, наличие деструктора, который делает что-нибудь интересное, является хорошим намеком на то, что вам также понадобится оператор присваивания.Фактически, существует еще одна из сгенерированных операций, а именно конструктор копирования, который выполняет примерно то же, что и назначение копирования, за исключением того, что копирование создает элементы вместо их назначения.Это также не то, что вы хотите от своего класса.
Теперь возникает интересный вопрос: как можно исправить FixedByteStream
?По сути, вам нужно либо использовать подсчет ссылок, чтобы отслеживать, сколько объектов в данный момент просматривает FixedByteStream
, выделить копию содержимого, либо вам нужно использовать семантическую поддержку перемещения (или ссылки на значения), которая является толькодоступно в C ++ 2011.Если вы действительно не знаете, что делаете, я рекомендую копировать поток во всех случаях и оставлю более продвинутый подход на будущее.