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: Как определить где создан объект
От: reversecode google
Дата: 26.03.18 17:51
Оценка:
переопределить 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: Как определить где создан объект
От: 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...
Пока на собственное сообщение не было ответов, его можно удалить.