Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/41: Рейтинг темы: голосов - 41, средняя оценка - 4.51
 Аватар для kordax
4 / 4 / 2
Регистрация: 08.06.2014
Сообщений: 89

Выделение памяти по известному адресу

20.07.2014, 22:22. Показов 8459. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

Вопрос сообственно в заголовке темы.
Как выделить память по нужному мне адресу, например:
Я хочу выделить память n* sizeof(T) по адресу 0x7fff2b98c30c
Сделать это нужно для того, чтобы я всегда потом мог обратиься к элементу, который там располагается.

И второй вопрос:
Как потом получить объект по этому фиксированному адресу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.07.2014, 22:22
Ответы с готовыми решениями:

Вызвано исключение по адресу 0x0FD466CB (ucrtbased.dll). Динамическое выделение памяти
Проблема в динамическом выделении памяти. Функция multiply доходит до возвращения объекта и вылетает исключение. Если функция вернет просто...

Чтение и запись значения по известному адресу
Нужно реализовать чтение и запись переменной по адресу. Конкретно: есть флеш-игра, есть программа Cheat Engine, и есть значение в этой...

Общий параметр для всех классов и создание объекта по известному адресу
Вообщем есть задание. Скажу сразу, вся реализация для меня понятна, за исключением одного момента. Поидее, мне нужен счётчик,...

29
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
21.07.2014, 01:11
Студворк — интернет-сервис помощи студентам
Ай, ай, ай! Посмотрите VirtualAlloc в MSDN =)) это ровно то, что Вам нужно (на тему об использовании КОНКРЕТНОГО адреса)

Добавлено через 4 минуты
Ещё я внезапно загуглил mmap - для unix
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
21.07.2014, 02:53
IIARTEMII, ну вот зачем это советовать? В VirtualAlloc задается адрес границы блока. Если там задан другой адрес, то он округляется до ближайшей границы блока. В общем, это не о том и не за тем
MSDN:
The starting address of the region to allocate. If the memory is being reserved, the specified address is rounded down to the nearest multiple of the allocation granularity. If the memory is already reserved and is being committed, the address is rounded down to the next page boundary.
А mmap - это отображение в память устройств или файлов. Аналог в windows - MapViewOfFile.
0
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
21.07.2014, 10:49
DrOffset,
MSDN:
VirtualAlloc function

Reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero...
...
The VirtualAlloc function can perform the following operations:
  • Commit a region of reserved pages
  • Reserve a region of free pages
  • Simultaneously reserve and commit a region of free pages
...
You can use VirtualAlloc to reserve a block of pages and then make additional calls to VirtualAlloc to commit individual pages from the reserved block...
Как бЭ...
Аналогично и с mmap, только для unix
И, да, что мешает сравнить адрес, который нам вернула функция с нашим заданным адресом? не совпал - освобождаем или используем другой. На высоком уровне это, вроде бы, единственный способ получить в своё распоряжение заданный нами кусок виртуальной памяти. На низком уровне получите все данные о процессе, который занимает данный кусок памяти, лишите его этого куска, отдайте ему другой, расскажите ему об этом, а себе зарезервируйте отобранный. Тем более, где-то (опять же) читал, что в защищенном режиме при работе с памятью процессу можно просто указать новый физический адрес блока памяти для виртуального блока, при этом оставив все виртуальные адреса на месте.

Добавлено через 3 минуты
с mmap, конечно, история не напрямую только с памятью связана, тут мы выходим из ситуации при помощи файла
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
21.07.2014, 11:00
Цитата Сообщение от kordax Посмотреть сообщение
Я всё пытаюсь реализовать shared_ptr, но на просторах интернета нету совершенно ни одной нормальной реализации
Современное проектирование на C++ Андрей Александреску.
Если мне склероз не изменяет - их там было.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
21.07.2014, 18:09
IIARTEMII, ну нет же. даже в том что ты процитировал, ключевое слово pages. VirtualAlloc работает со страницами, а не с конкретными адресами. Я же выделил жирным выше.

Цитата Сообщение от IIARTEMII Посмотреть сообщение
Аналогично и с mmap, только для unix
Mmap берет файл и отображает его на адресное пространство, позволяя усуществить произвольный доступ к файлу на чтение или запись посредством адресации в памяти. Т.е. память выделена большим блоком, достаточным для адресации заданного файла. С таким же успехом мы можем просто вызвать new в начале программы, выделив достаточно большой участок памяти, и на нем уже сделать свой собственный аллокатор или пул, который позволит выбрать произвольный незанятый адрес в пределах этого блока. Т.е. это настолько очевидно и не нужно связываться с никакими дополнительными инструментами. Но автор, очевидно, хотел совсем другого.

Добавлено через 4 минуты
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Современное проектирование на C++ Андрей Александреску.
Если мне склероз не изменяет - их там было.
Если ему бустовская показалась сложной, то Александреску тоже не понравится
0
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
21.07.2014, 19:14
DrOffset, сколько людей, столько мнений; почему мы не можем, опираясь на
the return value is the base address of the allocated region of pages
использовать этот адрес для хранения нашей информации?
По-моему, всё очень даже хорошо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <windows.h>
 
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main() {
    void *pmem = VirtualAlloc((void*)(0x260000), 4096, MEM_RESERVE, PAGE_READWRITE);
    if (!pmem)
        return -1;
    void *_pmem = VirtualAlloc((void*)(0x260000), 4096, MEM_COMMIT, PAGE_READWRITE);
    if (!_pmem) {
        VirtualFree(pmem, 0, MEM_RELEASE);
        return -1;
    }
    int *ptr = (int*)_pmem;
    *ptr = 3;
    cout << ptr << endl << *ptr << endl;
    _getch();
    VirtualFree(_pmem, 4096, MEM_DECOMMIT);
    VirtualFree(pmem, 0, MEM_RELEASE);
    return 0;
}
Я только немного не пойму про переносимость этого кода... Иногда работает RESERVE, иногда COMMIT, а иногда оба вместе. В любом случае, при неудаче мы уходим. Если убрать проверку на 10 строчке, то код работает очень переносимо, но сбои иногда появляются. Вообщем интересный вопрос, надо думать; а то, что Вы писали про округление - почитайте ещё, либо я Вас не понял, сколько ни прочту, либо Вы немного не так поняли иностранный язык
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
21.07.2014, 19:19
Цитата Сообщение от IIARTEMII Посмотреть сообщение
а то, что Вы писали про округление - почитайте ещё, либо я Вас не понял, сколько ни прочту, либо Вы немного не так поняли иностранный язык
Я цитату подсветил же выше.
rounded down to the nearest multiple of the allocation granularity
Что конкретно здесь не понятно и в чем противоречие с моими словами? Слово "округление" можно заменить на слово "выравнивание". Смысл не поменяется. VirtualAlloc низкоуровневая функция для манипуляции страницами памяти. Размер страницы на x86 32-бита равен 4Kb. Ничто не настораживает? Как минимум предложение использовать эту функцию для выделения памяти для одной переменной выглядит странно.
Цитата Сообщение от IIARTEMII Посмотреть сообщение
использовать этот адрес для хранения нашей информации?
Да можешь, только это совсем не конкретный адрес, как ты выше написал. Вот же твоя цитата:
Цитата Сообщение от IIARTEMII Посмотреть сообщение
на тему об использовании КОНКРЕТНОГО адреса
Совсем не в любом случае он будет именно тем, что ты задал. Да и использовать это для задачи ТС - это из пушки по воробьям как минимум.
Цитата Сообщение от IIARTEMII Посмотреть сообщение
Я только немного не пойму про переносимость этого кода...
Этот код вообще не переносим (в общепринятом смысле слова "переносимость"), т.к. опирается на свойства и API платформы windows.
0
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
21.07.2014, 19:38
Мои сообщения в большей мере о windows (так как ТС не задал конкретных рамок, вполне имею право), под переносимостью я имею в виду версию (XP, win7, win8 и их вариации).
Цитата Сообщение от DrOffset Посмотреть сообщение
Размер страницы на x86 32-бита равен 4Kb. Ничто не настораживает?
Ничего, совершенно
Цитата Сообщение от DrOffset Посмотреть сообщение
только это совсем не конкретный адрес
Совсем конкретный адрес, но не физический, о чём и была речь
Цитата Сообщение от DrOffset Посмотреть сообщение
Совсем не в любом случае он будет именно тем, что ты задал
Если он свободен - будет именно он, если его выровнять, опираясь на соглашение о виртуальной адресации памяти и выравнивании страниц

Добавлено через 8 минут
Что спорить, если я реализовал резервирование под свои нужды конкретно указанного мной участка виртуальной памяти и использовал его для чтения и записи данных?
Вопрос был:
Цитата Сообщение от kordax Посмотреть сообщение
Как выделить память по нужному мне адресу, например:
Я хочу выделить память n* sizeof(T) по адресу 0x7fff2b98c30c
Это сделано. Тут есть подводные камни, да (например, что выделяться будут блоки памяти с округлением до 4kb), но это сделано. Вопросы?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
21.07.2014, 19:53
IIARTEMII, твоя точка зрения понятна. Спорить дальше смысла не вижу, т.к. я уже в общем-то все сказал.

Добавлено через 11 минут
Цитата Сообщение от IIARTEMII Посмотреть сообщение
Вопросы?
Только один. Советовать частное решение с подводными камнями человеку, который захотел странного из-за неправильного понимания концепции shared_ptr - зачем? Вместо того чтобы объяснить ситуацию, указать на ошибки, приводится вариант, который создает иллюзию возможности общего решения первоначально ошибочного вопроса.
Цитата Сообщение от IIARTEMII Посмотреть сообщение
но это сделано.
В инженерии средства должны соответствовать решаемой задаче. А не быть из разряда "сделать любой ценой". Можно забивать гвозди и микроскопом, но он для этого не предназначен. Есть простое правило, "если задача сопротивляется решению, значит она была неверно поставлена".
0
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
21.07.2014, 20:09
Последнее моё слово в этой теме: с помощью предложенного мной метода можно выделять под себя даже 1 байт памяти; подводных камней тут не будет, если понимать, как работает распределение памяти. Человек захотел странного - он это получил, почему бы и нет? А решение не частное) Если программируете под windows, то Вы сами его используете, хоть и не догадываетесь об этом... все мы это используем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2014, 20:09

Распределение памяти. Динамическое выделение памяти
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Данные по адресу памяти
У меня есть адрес например 0x11E9B62C как узнать что по нему записанно?

Доступ к памяти по адресу
Есть структура, элементы которой адрес на начало массива в памяти и его размер. Адреса хранятся в 16-ричном формате. Мне нужно распечатать...

Прочитать из памяти по адресу
Задача: в памяти по адресу 0040:0010h (0x00400010) записано слово (информация о подключенном оборудовании). Нужно прочитать 12-й бит этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru