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