Может ли класс C ++ определить, находится ли он в стеке или в куче? - PullRequest
35 голосов
/ 13 января 2010

У меня есть

class Foo {
....
}

Есть ли способ у Foo выделить:

function blah() {
  Foo foo; // on the stack
}

и

function blah() {
  Foo foo* = new Foo(); // on the heap
}

Я хочу, чтобы Fooбыть в состоянии делать разные вещи в зависимости от того, выделено ли это в стеке или куче.

Редактировать:

Многие люди спрашивали меня, "зачем это делать?"Ответ:

Я сейчас использую GC с пересчетом.Тем не менее, я хочу иметь возможность бегать и метать тоже.Для этого мне нужно пометить набор «корневых» указателей - это указатели в стеке.Таким образом, для каждого класса я хотел бы знать, находятся ли они в стеке или в куче.

Ответы [ 15 ]

1 голос
/ 16 февраля 2011

Я бы рекомендовал вместо этого использовать умные указатели. По замыслу класс должен иметь данные и информацию о классе. Задачи бухгалтерского учета следует делегировать за пределы класса.

перегрузка new и delete может привести к большему количеству дыр, чем вы можете себе представить.

1 голос
/ 13 января 2010

Ответ на мета-вопрос, заданный pax, «почему вы хотите это сделать», скорее всего, вы получите более информативный ответ.

Теперь, если вы делаете это по «уважительной причине» (возможно, просто из любопытства), можете получить такое поведение, переопределив операторы new и delete, но не забудьте переопределить все 12 вариантов, включая:

новый, удалить, новый без броска, удалить без броска, новый массив, удалить массив, новый массив без броска, удалить массив без броска, размещение нового, удаление размещения, размещение нового массива, размещение удалить массив.

Одна вещь, которую вы можете сделать, это поместить ее в базовый класс и извлечь из него.

Это что-то вроде боли, так какое другое поведение вы хотели?

1 голос
/ 13 января 2010

Перегрузка new () для вашего класса. Таким образом, вы сможете различить кучу и выделение стека, но не между стеком и статической / глобальной.

0 голосов
/ 15 июня 2016

Есть решение, но оно вызывает наследование. См. Мейерс, «Более эффективный C ++», пункт 27.

(Вы можете увидеть это по этой ссылке:
http://bin -login.name / FTP / паб / документы / programming_languages ​​/ CPP / cffective_cpp / MEC / MI27_FR.HTM )

0 голосов
/ 27 марта 2013

Взгляните на программу здесь: http://alumni.cs.ucr.edu/~saha/stuff/memaddr.html. С помощью нескольких приведений она выдает:

        Address of main: 0x401090
        Address of afunc: 0x401204
Stack Locations:
        Stack level 1: address of stack_var: 0x28ac34
        Stack level 2: address of stack_var: 0x28ac14
        Start of alloca()'ed array: 0x28ac20
        End of alloca()'ed array: 0x28ac3f
Data Locations:
        Address of data_var: 0x402000
BSS Locations:
        Address of bss_var: 0x403000
Heap Locations:
        Initial end of heap: 0x20050000
        New end of heap: 0x20050020
        Final end of heap: 0x20050010
...