Как я могу создать структуру данных, начиная с указанного адреса памяти (без использования новой)? - PullRequest
1 голос
/ 19 января 2011

Я задавал подобный вопрос раньше, но только сейчас понял, что полученный ответ не совсем то, что я хотел.

Если у меня просто есть указатель какого-то типа структуры, как я могу либо двигатьсяили создать экземпляр того же типа структуры, начиная с адреса, указанного указателем структуры (которому я назначил адрес), без использования «new».

Ответы [ 4 ]

3 голосов
/ 19 января 2011

Вот для чего нужно размещение new:

foo* p = new(0x9000) foo(bar);
0 голосов
/ 19 января 2011

Если вы рассматриваете только C, где нет конструкторов, если у вас есть указатель на блок памяти, который по крайней мере такой же большой, как структура, тогда достаточно просто привести этот указатель к соответствующему типу.

Если вы говорите о C ++, то это зависит от фактического типа. Пишется ли оно как struct или class, здесь не имеет значения. Если тип имеет тривиальный конструктор , то вы можете использовать тот же подход, что и в C, так как конструктор фактически ничего не будет делать. Если объект имеет нетривиальный конструктор, то вам нужно для вызова конструктора, и это нужно сделать с помощью размещения new.

0 голосов
/ 19 января 2011

Хорошо.Допустим, у вас есть структура типа A.

A a;
A b;

Если вы хотите скопировать b в a (то есть в адрес a), вы должны использовать memcpy.http://www.cplusplus.com/reference/clibrary/cstring/memcpy/. Это приведет к тому, что содержимое "b" начнется с адреса a, заданного как &a.

Если у вас буксировка разных типов конструкции, убедитесь, что оба имеют одинаковый размеру вас неожиданное поведение.

0 голосов
/ 19 января 2011

Я могу придумать два решения

  1. Использовать новые вместо новых.

  2. Для структуры в стиле C просто скопируйте структуру в адрес памяти и введите ее - побитовое копирование

    т.е..

    CreateStructAtAddr(void* pOutput, mystruct* pInput)
    {
        *(mystruct*)pOutput = *pInput;
    }
    

Я игнорирую проверку правильности памяти для краткости

...