Можно ли определить класс памяти для переменной?
От: Nick-77  
Дата: 23.04.19 14:13
Оценка:
допустим есть некая

int f(void *p){

    // 
}


возможно ли определить класс памяти для p, статический, в куче или в стеке?
память
Re: Можно ли определить класс памяти для переменной?
От: GhostCoders Россия  
Дата: 23.04.19 14:23
Оценка:
Здравствуйте, Nick-77, Вы писали:

N7>возможно ли определить класс памяти для p, статический, в куче или в стеке?

мне кажется, что нет. аргументы функций и методов всегда через стек.
Третий Рим должен пасть!
Re: Можно ли определить класс памяти для переменной?
От: Zhendos  
Дата: 23.04.19 14:53
Оценка:
Здравствуйте, Nick-77, Вы писали:

N7>допустим есть некая


N7>
N7>int f(void *p){

N7>    // 
N7>}
N7>


N7>возможно ли определить класс памяти для p, статический, в куче или в стеке?



В общем случае нет, ведь указатель можно получить как угодно,
placement new например

char buf[N];
Foo *foo = new(buf) Foo;


или указатель на разделяемую память чем считать кучей или статической памятью?

Но в Linux можно например прочитать /proc/self/maps и понять по значению адреса,
откуда это из кучи, стека, или еще откуда-то
Re[2]: Можно ли определить класс памяти для переменной?
От: Nick-77  
Дата: 23.04.19 15:05
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, Nick-77, Вы писали:


N7>>допустим есть некая


N7>>
N7>>int f(void *p){

N7>>    // 
N7>>}
N7>>


N7>>возможно ли определить класс памяти для p, статический, в куче или в стеке?



Z>В общем случае нет, ведь указатель можно получить как угодно,

Z>placement new например

Z>
Z>char buf[N];
Z>Foo *foo = new(buf) Foo;
Z>


Z>или указатель на разделяемую память чем считать кучей или статической памятью?


Z>Но в Linux можно например прочитать /proc/self/maps и понять по значению адреса,

Z>откуда это из кучи, стека, или еще откуда-то



Разделяемая да, это вопрос.

Но хотя бы является ли объект статическим, типа
_Is_static(void *)


или тоже никак?
Re[2]: Можно ли определить класс памяти для переменной?
От: Nick-77  
Дата: 23.04.19 15:05
Оценка:
Здравствуйте, GhostCoders, Вы писали:

GC>Здравствуйте, Nick-77, Вы писали:


N7>>возможно ли определить класс памяти для p, статический, в куче или в стеке?

GC>мне кажется, что нет. аргументы функций и методов всегда через стек.

Понятно, что через стек, вопрос про то, на какую память смотрит указатель.
Re[3]: Можно ли определить класс памяти для переменной?
От: IID Россия  
Дата: 23.04.19 15:25
Оценка:
Здравствуйте, Nick-77, Вы писали:

N7>Но хотя бы является ли объект статическим, типа

N7>
N7>_Is_static(void *)
N7>


N7>или тоже никак?


Статические — лежат в загруженном образе. Причём R/O отдельно от R/W.
Можно взять адрес какой-нибудь заранее известной статической переменной, и убедиться, что страницы памяти для обеих переменных имеют одинаковую защиту и находятся в одном непрерывном блоке.

Аналогично для стека. Идти вверх по страницам стека, пока не наткнёмся на page guard или страницу переменной.
Правда это сработает только если переменная была создана в стеке этого же потока.
kalsarikännit
Re: Можно ли определить класс памяти для переменной?
От: Mr.Delphist  
Дата: 23.04.19 16:32
Оценка: +5
Здравствуйте, Nick-77, Вы писали:

N7>допустим есть некая


N7>
N7>int f(void *p){

N7>    // 
N7>}
N7>


N7>возможно ли определить класс памяти для p, статический, в куче или в стеке?


Как всегда, XY-проблема. С какими целями это предполагается использовать? Ну, поняли, что память в статике, и... и что?
Re: Можно ли определить класс памяти для переменной?
От: Bjorn Skalpe Земля  
Дата: 24.04.19 05:29
Оценка: +1
N7>возможно ли определить класс памяти для p, статический, в куче или в стеке?

Зачем? Если встал такой вопрос, значит ошибка проектирования.
Re[2]: Можно ли определить класс памяти для переменной?
От: Went  
Дата: 24.04.19 06:13
Оценка:
Здравствуйте, Bjorn Skalpe, Вы писали:
BS>Зачем? Если встал такой вопрос, значит ошибка проектирования.
Помню как-то пытался писать умный указатель, который мог указывать на объекты, являющимися частями какой-то структуры. Идея была такая: "умный указатель знает, что ему передали голый указатель на объект, который он принципиально не имеет права удалять, потому что его никто не выделял, и поэтому он не будет его удалять при собственному уничтожении". Но это все фигня без задач, на практике такое никому не нужно, ИМХО.
Re[3]: Можно ли определить класс памяти для переменной?
От: Chorkov Россия  
Дата: 24.04.19 07:32
Оценка:
Здравствуйте, Nick-77, Вы писали:

N7>Разделяемая да, это вопрос.


N7>Но хотя бы является ли объект статическим, типа

N7>
N7>_Is_static(void *)
N7>


N7>или тоже никак?


Посмотри вот это:
https://stackoverflow.com/questions/4308996/finding-the-address-range-of-the-data-segment

Хотя я не проверял указанное там решение.
Re[3]: Можно ли определить класс памяти для переменной?
От: Bjorn Skalpe Земля  
Дата: 25.04.19 08:43
Оценка:
Здравствуйте, Went, Вы писали:

W>Здравствуйте, Bjorn Skalpe, Вы писали:

BS>>Зачем? Если встал такой вопрос, значит ошибка проектирования.
W>Помню как-то пытался писать умный указатель, который мог указывать на объекты, являющимися частями какой-то структуры. Идея была такая: "умный указатель знает, что ему передали голый указатель на объект, который он принципиально не имеет права удалять, потому что его никто не выделял, и поэтому он не будет его удалять при собственному уничтожении". Но это все фигня без задач, на практике такое никому не нужно, ИМХО.

Не надо передавать указатель на объект, который он не может удалять... х)
На практике удалять надо там же, где и создавал, в противном случае ошибка проектирования.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.