Как определить где создан объект
От: 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: Как определить где создан объект
От: reversecode google
Дата: 26.03.18 17:51
Оценка:
переопределить 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: Как определить где создан объект
От: Mr.Delphist  
Дата: 28.03.18 11:49
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Как нынче принято определять где был создан объект в стеке или в куче?


Немного оффтоп: а какая цель преследуется? Как должно поменяться поведение объекта, если он узнает где именно был создан?
Re[2]: Как определить где создан объект
От: kov_serg Россия  
Дата: 28.03.18 13:32
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Немного оффтоп: а какая цель преследуется? Как должно поменяться поведение объекта, если он узнает где именно был создан?

Сам объект не меняет поведения, меняет поведение тот который ими оперирует.
Для объектов в стеке может быть применена другая логика работы с ними, т.к. порядок их создания и уничтожения фиксирован.
Сам объект может быть вложен в другие.
struct B {
  A stack_marker;
};
Re: Как определить где создан объект
От: alexanderfedin США http://alexander-fedin.pixels.com/
Дата: 29.03.18 17:58
Оценка:
Здравствуйте, 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: Как определить где создан объект
От: _NN_ www.nemerleweb.com
Дата: 29.03.18 18:15
Оценка:
Здравствуйте, kov_serg, Вы писали:

2003 Определить в конструкторе где создан объект?
Автор: Karabinos
Дата: 01.04.03

2005 В какой памяти объект
Автор: TYuD
Дата: 31.10.05

2005 Хип или не хип, вопрос к знатокам
Автор: Erop
Дата: 26.08.05


Как обычно стоит понять какую проблему решаем.
Если непереносимые хаки подойдут, то можно, например, посмотреть если объект лежит в области выделенную под стек потока.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.