Когда вы звоните mmap()
, вы просто получаете блок сырой памяти.Таким образом, вы не можете наивно разыменовывать указатель map
, не вызывая некоторый тип неопределенного поведения ... просто приведение памяти, возвращенной из mmap()
, к типу Tree*
, как вы это сделали, на самом деле не создает объект Tree
в отображенной памяти.
Если вы хотите сконструировать или даже скопировать сконструировать объект Tree
в памяти, возвращенной из mmap
, вы можете захотеть использовать placement new
.Например, вы можете сделать что-то вроде следующего:
void* map;
map = mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);
//...error checking
Tree* tree = new(map) Tree(); //placement new syntax
Это фактически создаст объект по умолчанию Tree
в памяти, возвращенной из mmap
, и в этот момент вы можете правильно использоватьtree
переменная-указатель для дальнейшего добавления узлов в дерево.Например, следующий код теперь может быть вызван без создания неопределенного поведения:
Node* root = new Node("data");
tree->set_root(root);
При placement new
переменная tree
указывает на фактический объект Tree
, и теперь вы можетедолжным образом разыменуйте этот указатель, а также любые методы, связанные с этим объектом.
Однако следует помнить, что при использовании placement new
вам придется вручную вызывать деструктор для вашего Tree
объект, и вам придется вручную освободить память, выделенную через mmap()
... вы не можете вызвать delete
на Tree*
.