Здравствуйте, Nick-77, Вы писали:
N7>возможно ли определить класс памяти для p, статический, в куче или в стеке?
мне кажется, что нет. аргументы функций и методов всегда через стек.
Третий Рим должен пасть!
Re: Можно ли определить класс памяти для переменной?
Здравствуйте, 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]: Можно ли определить класс памяти для переменной?
Здравствуйте, GhostCoders, Вы писали:
GC>Здравствуйте, Nick-77, Вы писали:
N7>>возможно ли определить класс памяти для p, статический, в куче или в стеке? GC>мне кажется, что нет. аргументы функций и методов всегда через стек.
Понятно, что через стек, вопрос про то, на какую память смотрит указатель.
Re[3]: Можно ли определить класс памяти для переменной?
Здравствуйте, Nick-77, Вы писали:
N7>Но хотя бы является ли объект статическим, типа N7>
N7>_Is_static(void *)
N7>
N7>или тоже никак?
Статические — лежат в загруженном образе. Причём R/O отдельно от R/W.
Можно взять адрес какой-нибудь заранее известной статической переменной, и убедиться, что страницы памяти для обеих переменных имеют одинаковую защиту и находятся в одном непрерывном блоке.
Аналогично для стека. Идти вверх по страницам стека, пока не наткнёмся на page guard или страницу переменной.
Правда это сработает только если переменная была создана в стеке этого же потока.
kalsarikännit
Re: Можно ли определить класс памяти для переменной?
Здравствуйте, Bjorn Skalpe, Вы писали: BS>Зачем? Если встал такой вопрос, значит ошибка проектирования.
Помню как-то пытался писать умный указатель, который мог указывать на объекты, являющимися частями какой-то структуры. Идея была такая: "умный указатель знает, что ему передали голый указатель на объект, который он принципиально не имеет права удалять, потому что его никто не выделял, и поэтому он не будет его удалять при собственному уничтожении". Но это все фигня без задач, на практике такое никому не нужно, ИМХО.
Re[3]: Можно ли определить класс памяти для переменной?
Здравствуйте, Went, Вы писали:
W>Здравствуйте, Bjorn Skalpe, Вы писали: BS>>Зачем? Если встал такой вопрос, значит ошибка проектирования. W>Помню как-то пытался писать умный указатель, который мог указывать на объекты, являющимися частями какой-то структуры. Идея была такая: "умный указатель знает, что ему передали голый указатель на объект, который он принципиально не имеет права удалять, потому что его никто не выделял, и поэтому он не будет его удалять при собственному уничтожении". Но это все фигня без задач, на практике такое никому не нужно, ИМХО.
Не надо передавать указатель на объект, который он не может удалять... х)
На практике удалять надо там же, где и создавал, в противном случае ошибка проектирования.