Создание структуры по назначенному адресу (назначение распределения) - PullRequest
1 голос
/ 19 января 2011

Для класса, который я беру, нам нужно разработать утилиты распределения.

В сторону безопасности, я буду использовать дальние указатели для получения и назначения адресов некоторым структурам.Мне также не разрешено использовать «memalloc» в этом назначении.

Я сослался на: Связанные списки в C без malloc , чтобы узнать, как создать связанную структуру без использования memalloc.Однако мне нужно знать, как я могу назначить новый экземпляр для определенного адреса.Например, если у меня есть начальный указатель на адрес 0x5000, я бы хотел создать свой список, чтобы я мог использовать инкрементное смещение (скажем, 256), чтобы начать следующую структуру на 256 байт вперед (с точки зрения адреса)моя отправная точка.

Это задание основано на изучении сегментации и архитектуры x86.

Любая помощь приветствуется!

Ответы [ 2 ]

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

В зависимости от того, что вы хотите сделать, вы, вероятно, захотите использовать комбинацию следующих инструментов:

Размещение нового : Вы можете создавать объекты в определенных местах памяти, используяследующий синтаксис:

new (reinterpret_cast<void*>(0x500)) MyObject(/* ...ctor args... */);

Это не выделяет никакой новой памяти;вместо этого он просто вызывает конструктор, используя указанный адрес памяти в качестве объекта-получателя.Будьте осторожны с ограничениями выравнивания!

Пользовательские распределители. Вы можете определить новый класс по линиям std::allocator<T>, который резервирует память в указанных вами местах.Затем вы можете создавать контейнеры STL, которые автоматически используют память в нужных вам местах.

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

Я только что получил электронное письмо от своего профессора, и мне не разрешено использовать «новый» оператор.Просто чтобы дважды проверить то, что вы сказали мне, я могу спросить еще раз с этим примером:

struct example{ 
    int a; 
    struct example *next; 
}; 

void *ptr; 
ptr = 0x5000; 
ptr = &((example)*ptr);

Или что-то в этом роде?

...