Чтобы лучше всего объяснить эту проблему, я построил простой пример. Скажем, у меня есть класс Blob
следующим образом:
class Blob
{
string personalName;
string& familyName;
}
A Blob
может быть порожден Создателем (также известным как Программист), после чего он может выбрать personalName
и, поскольку он имеет привилегию быть Blob 1-го поколения
, он может выбрать свое собственное familyName
.
В качестве альтернативы Blob
может может быть создан путем порождения существующего Blob
, после чего он выбирает свое собственное personalName
, но разделяет familyName
со всеми другими Blob
s, которые были клонированы в этом семействе. Если один Blob
изменяет фамилию, все остальные члены семьи получают это имя автоматически.
Пока все звучит хорошо, пока при написании конструктора Blob
I см. это:
Blob::Blob() :
personalName(pickName()),
familyName(pickFamilyName())
{ }
...
string& Blob::pickFamilyName()
{
return *(new string("George"));
} // All Blobs have family name "George" in this example
Eek! Выделить память в куче, а затем назначить ее ссылочной переменной ?! Это выглядит устрашающе!
Мои инстинкты верны, что с этим что-то не так, или мне это кажется странным только потому, что это необычный образец? Если что-то не так, что это? Почему это плохой дизайн?
Примечание. Было бы важно освободить выделенную в куче память путем подсчета ссылок и удаления памяти при уничтожении последнего Blob-объекта или каким-либо другим способом.