В некоторых встроенных ситуациях память должна перемещаться с помощью функций стиля memcopy (например, из внешней памяти или с помощью закрытых вызовов API).Конструкция объекта «memcopy» объекта в C++
Когда такое C++ объект должен быть перемещен таким образом, однако он не имеет конструктор по умолчанию, вы не можете сделать что-то вроде этого,:
class Object {
//local data
public:
Object(/* not a default constructor */){}
}
//elsewhere:
Object o; //compiler will complain here...
memcpy_like_function(src_address, &o, sizeof(o));
потому что Object
не имеет конструктор по умолчанию, и, таким образом, компилятор будет жаловаться на создание Object o.
Некоторые заметки из вещей, которые показали в комментариях:
memcpy_like_function
является как тетсра, это на самом деле не тетсра.src_address
не является указателем на адрес, который я могу достигнуть, или int, представляющий указатель на адрес, который я могу достигнуть. Это int, представляющий адрес в пространстве памяти, к которому я не могу добраться. Единственная возможность получить доступ к этому пространству памяти - это эта функция.Object
не имеет конструктора по умолчанию, не имеет виртуальных функций, не наследуется и не наследует ничего.Object
- trivially copyable.
Каков правильный способ справиться с созданием такого объекта в этой ситуации, не помещая его в кучу? Предпочтительно, я хотел бы получить объект, выделенный стек, который будет корректно вести себя с областью и деструкторами. Для целей этого вопроса Object
не наследует ни от чего.
Прошу прокомментировать до голосования и голосования, чтобы закрыть .... это невероятно грубо, чтобы поступать иначе. –
@ Eichhörnchen: поскольку ячейка памяти, в которой она находится, недоступна за пределами закрытого вызова API ... –
@AndrewSpott Закрытие голосования будет включать в себя причину - иногда дополнительный комментарий не требуется –