Re: Как определить где создан объект
От:
Lexey
Дата: 26.03.18 18:12
Оценка:
+4
Здравствуйте, kov_serg, Вы писали:
_>Как нынче принято определять где был создан объект в стеке или в куче?
А зачем?
_>Такой способ немного огорчает.
По идее, это вообще UB, ибо используется арифметика между указателями на несвязанные области памяти.
"Будь достоин победы" (c) 8th Wizard's rule.
Как определить где создан объект
От:
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[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
Как обычно стоит понять какую проблему решаем.
Если непереносимые хаки подойдут, то можно, например, посмотреть если объект лежит в области выделенную под стек потока.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить