Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 22:22     Выделение памяти по известному адресу #1
Всем привет.

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

И второй вопрос:
Как потом получить объект по этому фиксированному адресу?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 22:30     Выделение памяти по известному адресу #2
где то тут я уже задавал этот вопрос... я так понял нельзя так сделать увы
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 22:33  [ТС]     Выделение памяти по известному адресу #3
Хорошо, а как тогда мне создать объект-счётчик в конструкторе класса так, чтобы потом создавая другой объект этого же класса проверить есть ли уже объект-счётчик общий для всех и не создавать его?
Я всё пытаюсь реализовать shared_ptr, но на просторах интернета нету совершенно ни одной нормальной реализации, кроме мега-сложной в boost.
Люди делают очевидные и простые вещи, которые можно сделать и так, но когда речь заходит о:

C++
1
2
3
4
5
6
7
shared_ptr<T> a;
shared_ptr<T> b;
 
int x;
 
a = x;
b = x;
То никто даже мыслишки не подкинет.
Получается что нужно создавать базу этих самых shared_ptr и какой-то параметр, чтобы они себя идентифицировали.
Но как создать эту базу, массив, объект, если каждый раз он теряется, ведь создать его нужно в самом классе shared_ptr?
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 22:35     Выделение памяти по известному адресу #4
Цитата Сообщение от kordax Посмотреть сообщение
Хорошо, а как тогда мне создать объект-счётчик в конструкторе класса так, чтобы потом создавая другой объект этого же класса проверить есть ли уже объект-счётчик общий для всех и не создавать его?
нуу я не уверен что оно для этого подходит, но возможно поможет слово static...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.07.2014, 22:38     Выделение памяти по известному адресу #5
kordax, была тут тема Shared_ptr собственная реализация
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 22:39  [ТС]     Выделение памяти по известному адресу #6
Там совсем не то.
Там используется свой, нестандартный object, с которым shared_ptr и работает.
У меня он шаблонный, как настоящий и умеет работать со стандартными объектами, которые я не перегружаю никак.

Написать свой собственный object и фиксировать в нём это вообще дело нетрудное, но сделано не так, это просто халява.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
20.07.2014, 22:41     Выделение памяти по известному адресу #7
оно?
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 22:43  [ТС]     Выделение памяти по известному адресу #8
Именно оно, но реализации тут нету.
Опять же встаёт вопрос о создании в классе абстрагированного объекта, который будет существовать по известному пути так, чтобы его можно было найти и он будет общий для всех объектов share_ptr.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.07.2014, 22:48     Выделение памяти по известному адресу #9
Цитата Сообщение от kordax Посмотреть сообщение
Там используется свой, нестандартный object, с которым shared_ptr и работает.
У меня он шаблонный, как настоящий и умеет работать со стандартными объектами, которые я не перегружаю никак.
Там есть ссылки на код, посмотри:
http://ideone.com/J3YYC4 - тут просто меняешь object на параметр шаблона
http://ideone.com/6n1jFV - тут и так шаблон класса (правда как тут оно работает я не знаю).
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 22:51  [ТС]     Выделение памяти по известному адресу #10
В случае:
C++
1
2
3
4
5
6
7
shared_ptr<int> a;
shared_ptr<int> b;
 
int x;
 
a = x;
b = x;
Как он сработает? Ведь тут счётчик должен показывать, что на объект x уже стоит два указателя.
Там я вижу только через operator= или я не прав? Возможно проглядел, прошу поправить.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.07.2014, 23:01     Выделение памяти по известному адресу #11
Цитата Сообщение от kordax Посмотреть сообщение
Там я вижу только через operator= или я не прав?
Да, через присвоение и конструкторы\деструкторы. Только shared_ptr с указателями работает, а не с объектами. В той реализации что я знаю работает так: в отдельной структуре храниться указатель на объект и счётчик; объекты shared_ptr ссылаются на неё, соответственно тут a и b будут ссылаться на один и тот же экземпляр этой структуры; при присвоении\конструировании из указателя на объект создаётся такая структура, счётчик == 1, при конструировании\присвоении из другого shared_ptr просто увеличивается счётчик; в деструкторе декремент счётчика, если счётчик == 0, то удаляем структуру.

Добавлено через 1 минуту
Можно посмотреть, как реализован shared_ptr в стандартной библиотеке\boost\ещё где, но там разобраться думаю будет сложнее, так как эти реализации уже не "на коленке" сделаны.
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 23:07  [ТС]     Выделение памяти по известному адресу #12
Блин, это не то.
А мысли как реализовать по-моему может есть у кого?
Аля:
C++
1
2
3
4
5
6
7
8
9
shared_ptr<int> a;
shared_ptr<int> b;
 
int x;
 
a = x;
b = x;
 
cout << *a.counter; //На вывод идёт 2
В бусте посмотрел и не осилил, там хардкор для ценителей ассемблера.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
20.07.2014, 23:11     Выделение памяти по известному адресу #13
Цитата Сообщение от kordax Посмотреть сообщение
чтобы потом создавая другой объект этого же класса проверить есть ли уже объект-счётчик общий для всех и не создавать его?
Я всё пытаюсь реализовать shared_ptr, но на просторах интернета нету совершенно ни одной нормальной реализации, кроме мега-сложной в boost.
Проблема в том, что обычный shared_ptr так не работает. Суть shared_ptr в том, что создав однажды объект, записав его указатель в экземпляр shared_ptr, а потом скопировав экземпляр shared_ptr, мы получим увеличение значения счетчика ссылок. Соответственно при уничтожении экземпляра (уже ссылающегося на наш объект) shared_ptr, мы получим уменьшение значения счетчика ссылок. Если мы создали два независимых shared_ptr, то никакого общего счетчика ссылок естественно у них не будет. Это я к тому, что ты пытаешься сделать нечто свое и исходники shared_ptr тебе все равно в этом не помогли бы. Хотя вот, можешь посмотреть.

Цитата Сообщение от kordax Посмотреть сообщение
C++
1
2
3
4
5
6
7
shared_ptr<int> a;
shared_ptr<int> b;
 
int x;
 
a = x;
b = x;
Как он сработает? Ведь тут счётчик должен показывать, что на объект x уже стоит два указателя.
Если, опять же, мы рассматриваем стандартный shared_ptr, то ответ нет, счетчик в этом случае не должен этого показывать.
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 23:14  [ТС]     Выделение памяти по известному адресу #14
Да, это уже понял.
Хорошо, а то что я хочу, оно вообще реализуемо?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
20.07.2014, 23:14     Выделение памяти по известному адресу #15
Цитата Сообщение от kordax Посмотреть сообщение
А мысли как реализовать по-моему может есть у кого?
Счетчик ссылок должен быть синглтоном, инстанция которого зависит от типа, переданного в твой shared_ptr. Тогда ты сможешь считать независимые объекты shared_ptr одного типа одним и тем же счетчиком.
Только я не очень понимаю какой смысл в таком классе?
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
20.07.2014, 23:20  [ТС]     Выделение памяти по известному адресу #16
Смысл в том, что я уцепился за это задание и хочу так сделать
Счетчик ссылок должен быть синглтоном,
Можно поподробнее
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
20.07.2014, 23:23     Выделение памяти по известному адресу #17
Цитата Сообщение от kordax Посмотреть сообщение
Смысл в том, что я уцепился за это задание и хочу так сделать
Пока что, если честно, не совсем понятно так, это как
Цитата Сообщение от kordax Посмотреть сообщение
Можно поподробнее
Можно, только то, о чем я говорил, мне кажется все-таки отличается от того, что хотел ты. Поэтому давай сначала ты расскажешь о том, как ты такой класс хочешь применять. Пример, который был выше не очень походит на использование shared_ptr (в любом варианте), т.к. нет никакого смысла считать объект на стеке (int x).
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
20.07.2014, 23:43     Выделение памяти по известному адресу #18
Цитата Сообщение от kordax Посмотреть сообщение
Я хочу выделить память n* sizeof(T) по адресу 0x7fff2b98c30c
Возможно на очень низком уровне (я где-то читал реализацию менеджмента памяти на винде, там можно было конкретную область памяти проверить на занятость и, если она свободна, то мы её занимаем).
Но если вы лично не хотите задавать какой-то адрес, а просто выделяете память и хотите в эту память что-то положить, то "placement new" Вам в помощь.
В стандарте, например, сказано, что:
C++
1
2
void* place = operator new(sizeof(Something)); // 1
Something* p = new (place) Something(); // 2
1 - выделяет память и возвращает нам указатель; 2 - размещает конкретный объект в этой области памяти. Это что-то типа использования malloc, но C++ вариант.
Со статической памятью можно аналогично:
C++
1
2
3
char buffer[100];
void *ptr = (void*)buffer;
Something *p = new(ptr) Something();
Тут память освобождать не надо; В этом операторе new очень расплывчатая формулировка использования... данные, которые многие папки программисты приводят по всему интернету, зачастую противоречат друг другу. В стандарте дан тот минимум, который необходим для использования, а дальше берём и тестируем на утечки, на правильность размещения и вообще смотрим механику работы этого оператора в конкретной реализации конкретного компилятора
kordax
 Аватар для kordax
4 / 4 / 1
Регистрация: 08.06.2014
Сообщений: 89
21.07.2014, 00:17  [ТС]     Выделение памяти по известному адресу #19
Мне нужно всё осмыслить)).
Ради прокачки я кстати и хотел создать такой мазохистский класс, чтобы просто понять, как это возможно.
С практической точки зрения я его применять не буду, это просто задание из книги Страуструпа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 00:53     Выделение памяти по известному адресу
Еще ссылки по теме:

Доступ к памяти по адресу C++
C++ Общий параметр для всех классов и создание объекта по известному адресу
Доступ к произвольному адресу памяти C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
21.07.2014, 00:53     Выделение памяти по известному адресу #20
Цитата Сообщение от kordax Посмотреть сообщение
С практической точки зрения я его применять не буду, это просто задание из книги Страуструпа.
Ну Страуструп вряд ли подразумевал такое использование, как ты тут описал.
Вообще я попросил пример использования для того, что бы лучше понять что тебе нужно и что ты хочешь. Правильно сформулированный вопрос содержит половину ответа
Yandex
Объявления
21.07.2014, 00:53     Выделение памяти по известному адресу
Ответ Создать тему
Опции темы

Текущее время: 11:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru