Как определить где создан объект
От:
kov_serg
Дата: 26.03.18 17:30
Оценка:
Как нынче принято определять где был создан объект в стеке или в куче?
#include <stdio.h>
void * stack_top=0;
bool on_stack(void *x) {
char *a=(char *)&x, *b=(char *)x, *c=(char *)stack_top;
return c && ((c-a<0) ^ (b-a<c-a));
}
struct A {
bool stack;
A() { stack=on_stack(this ); printf("A.stack=%d\n" ,stack); }
~A() { printf("~A.stack=%d\n" ,stack); }
};
int main(int argc,char ** argv) {
stack_top=&argc;
A a1[2];
A *a2=new A();
delete a2;
return 0;
}
Такой способ немного огорчает.
Re: Как определить где создан объект
переопределить new для объекта, как вариант
Re: Как определить где создан объект
От:
Lexey
Дата: 26.03.18 18:12
Оценка:
+4
Здравствуйте, kov_serg, Вы писали:
_>Как нынче принято определять где был создан объект в стеке или в куче?
А зачем?
_>Такой способ немного огорчает.
По идее, это вообще UB, ибо используется арифметика между указателями на несвязанные области памяти.
"Будь достоин победы" (c) 8th Wizard's rule.
Re[2]: Как определить где создан объект
От:
kov_serg
Дата: 27.03.18 12:28
Оценка:
Здравствуйте, reversecode, Вы писали:
R>переопределить new для объекта, как вариант
Что-то типа такого?
struct A {
bool stack;
A() { stack=news.no(this ); }
static struct news_t {
char * p; size_t s;
bool no(void * v) const { char *x=(char *)v; return s==0 || x-p<0 || x-p>=s; }
} news;
void * operator new (size_t size) {
char *p=new char [size];
news.p=p; news.s=size;
return p;
}
void * operator new [] (size_t size) {
char *p=new char [size];
news.p=p; news.s=size;
return p;
}
};
A::news_t A::news={0,0};
По моему так еще хуже.
Re: Как определить где создан объект
Здравствуйте, kov_serg, Вы писали:
_>Как нынче принято определять где был создан объект в стеке или в куче?
Немного оффтоп: а какая цель преследуется? Как должно поменяться поведение объекта, если он узнает где именно был создан?
Re[2]: Как определить где создан объект
От:
kov_serg
Дата: 28.03.18 13:32
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:
MD>Немного оффтоп: а какая цель преследуется? Как должно поменяться поведение объекта, если он узнает где именно был создан?
Сам объект не меняет поведения, меняет поведение тот который ими оперирует.
Для объектов в стеке может быть применена другая логика работы с ними, т.к. порядок их создания и уничтожения фиксирован.
Сам объект может быть вложен в другие.
struct B {
A stack_marker;
};
Re: Как определить где создан объект
Здравствуйте, kov_serg, Вы писали:
_>Как нынче принято определять где был создан объект в стеке или в куче?
_>_>#include <stdio.h>
_>void * stack_top=0;
_>bool on_stack(void *x) {
_> char *a=(char *)&x, *b=(char *)x, *c=(char *)stack_top;
_> return c && ((c-a<0) ^ (b-a<c-a));
_>}
_>struct A {
_> bool stack;
_> A() { stack=on_stack(this ); printf("A.stack=%d\n" ,stack); }
_> ~A() { printf("~A.stack=%d\n" ,stack); }
_>};
_>int main(int argc,char ** argv) {
_> stack_top=&argc;
_> A a1[2];
_> A *a2=new A();
_> delete a2;
_> return 0;
_>}
_>
_>Такой способ немного огорчает.
Garbage Collection делаешь?
Respectfully,
Alexander Fedin.
Re: Как определить где создан объект
Здравствуйте, kov_serg, Вы писали:
2003
Определить в конструкторе где создан объект?Автор: Karabinos Дата: 01.04.03
2005
В какой памяти объектАвтор: TYuD Дата: 31.10.05
2005
Хип или не хип, вопрос к знатокамАвтор: Erop Дата: 26.08.05
Как обычно стоит понять какую проблему решаем.
Если непереносимые хаки подойдут, то можно, например, посмотреть если объект лежит в области выделенную под стек потока.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить