Указатели не могут быть сохранены непосредственно в файл, потому что они указывают на абсолютные адреса. Чтобы решить эту проблему, я написал Realiprapty_ptr
шаблон , который содержит смещение вместо абсолютного адреса.
На основании того факта, что только тривиально копироваемые типы могут быть благополучно скопированы, я сделал предположение, что этот тип, необходимый для того, чтобы быть тривиально скопинным, который будет безопасно сохраняться в отображенном памяти файле и извлеките позже.
Это ограничение оказалось немного проблематичным, потому что созданный компилятор Copy Constructor не ведет себя значимым образом. Я ничего не нашел, что запрещаю мне по умолчанию конструктора копирования и сделать его частным, поэтому я сделал его частным, чтобы избежать случайных копий, которые приведут к неопределенному поведению.
Позже я нашел Boost :: Intercopess :: Offset_PTR
, творение которого было обусловлено тем же потребностями. Однако оказывается, что Offset_ptr
не является периодически скопинным, потому что он реализует свой собственный пользовательский конструктор копирования.
Является ли мое предположение о том, что умный указатель должен быть тривециально скопирован, чтобы быть сохраненным, безопасно неверно ошибаться?
Если такого ограничения, я задаюсь вопросом, могу ли я благополучно сделать следующее. Если нет, именно то, какие требования к тому, что тип должен соответствовать использованию в сценарии, который я описал выше?
struct base {
int x;
virtual void f() = 0;
virtual ~base() {} // virtual members!
};
struct derived : virtual base {
int x;
void f() { std::cout << x; }
};
using namespace boost::interprocess;
void persist() {
file_mapping file("blah");
mapped_region region(file, read_write, 128, sizeof(derived));
// create object on a memory-mapped file
derived* d = new (region.get_address()) derived();
d.x = 42;
d->f();
region.flush();
}
void retrieve() {
file_mapping file("blah");
mapped_region region(file, read_write, 128, sizeof(derived));
derived* d = region.get_address();
d->f();
}
int main() {
persist();
retrieve();
}
Благодаря всем те, которые предоставили альтернативы. Вряд ли я буду использовать что-то еще в ближайшее время, потому что, как я объяснил, у меня уже есть рабочее решение. И, как вы можете видеть из использования вопросительных знаков выше, мне действительно интересно знать, почему повышение может уйти без тривиально копированного типа, а как далеко вы можете пойти с ним: это совершенно очевидно, что классы с виртуальными членами не будут Работа, но Где вы рисуете линию?