Эта программа хранит ссылки на объекты, а затем мы можем получить их
Не хранит ссылки. Хранит объекты.
- Могу ли я использовать ссылку таким образом. Это безопасно?
Способ использования ссылок в вашей программе безопасен. Ни одна из ваших ссылок не существует дольше, чем время жизни указанного объекта.
- Почему вызывается конструктор копирования?
Поскольку Object savedObject = storage.getObjectAtIndex(2);
является инициализацией копирования.
- Существуют ли другие проблемы в моем коде?
Вы выделяете блок памяти, используя malloc
, не создавая в памяти ни одного экземпляра Object
. Затем в строке objs[index] = obj;
вы копируете и назначаете экземпляр Object
, который находится в памяти ... за исключением того, что нет экземпляра Object
, поскольку вы никогда не создавали его. Как следствие, поведение вашей программы не определено.
Кроме того, Storage
небезопасно, потому что если вы сделаете его копии (случайно или специально), он попытается освободить одно и то же выделение дважды. Поведение этого будет неопределенным.
Чтобы устранить обе проблемы, используйте std::vector
вместо попытки ручного управления памятью.
Кроме того, lastPointer = objs + sizeof (Object) * (width - 1);
находится далеко за пределами выделенной памяти. Возможно, вы упустили из виду тот факт, что арифметика указателей работает с шагом в размере объекта. Дальнейшее умножение на sizeof (Object)
не имеет смысла в этом контексте.