Найти указатели от pointee - PullRequest
0 голосов
/ 25 февраля 2010

Из этого кода:

int x = 5;
int other = 10;
vector<int*> v_ptr; 
v_ptr.push_back(&x);
v_ptr.push_back(&other);
v_ptr.push_back(&x);

Могу ли я узнать, кто указывает на x, из самой переменной x, чтобы мне не приходилось искать внутри v_ptr адрес x? Возможно ли это в C ++ или C ++ 0x?

Я читал, что при сборке мусора они смотрят на память и смотрят, указывает ли что-нибудь на это или нет, затем принимают решение удалить неиспользуемую переменную и т. Д.

Ответы [ 7 ]

18 голосов
/ 25 февраля 2010

Нет. Это все равно, что спросить человека, знают ли они всех, кто знает его адрес.

3 голосов
/ 25 февраля 2010

Нет, вы не можете знать, что имеет ссылку на x, не просматривая возможные места, которые вы ему присвоили (v_ptr)

- или--

Если вы должны это сделать, вы можете захотеть сделать какое-то отслеживание ссылок (которое можно использовать для сбора мусора), например

v_ptr[0]=add_reference(&x,&v_ptr[0]);

где add_reference - это некоторая функция, имеющая список ссылок на первый аргумент, со ссылкой в ​​качестве второго аргумента (что может быть сложно с типами STL)

1 голос
/ 25 февраля 2010

В дополнение к другим точным ответам здесь, обратите внимание, что в языках с сборкой мусора (C ++. NET, я полагаю, или с любыми другими обычными языками, Java / C # и т. Д.), Одним из методов сбора мусора является обход ссылок , отмечая все, на что указано.

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

1 голос
/ 25 февраля 2010

Нет, это невозможно узнать с помощью необработанного указателя.

Определенные типы «умных указателей» (которые на самом деле являются объектами, которые содержат указатели и другие метаданные о указателе) хранят в качестве части своих метаданных список или количество всех ссылок на объект, на который указывает указатель, умные указатели. В языках сбора мусора этот механизм используется для определения того, не ссылается ли объект больше, но он не является характеристикой стандартного указателя C или C ++.

1 голос
/ 25 февраля 2010

Нет, невозможно узнать, кто указывает на х.

Кроме того, C ++ не является сборщиком мусора.

Даже если вы используете shared_pointer для x, вы можете узнать, сколько указателей на x, а не кто они.

0 голосов
/ 14 мая 2010

Да , вы можете знать, есть ли - в данный момент выполнения - указатель на вашу переменную. Все, что вам нужно сделать, это отслеживать память, выделенную для каждой переменной в процессе. Это означает знание начального и конечного адресов стека и кучи. Затем вы можете выполнить простой последовательный поиск местоположения вашей переменной в этих диапазонах адресов.

Хотя итерации по этим относительно небольшим частям памяти не должны занимать много времени, вы можете оптимизировать время поиска за счет некоторых дополнительных затрат памяти и затрат на создание указателей, поддерживая структуру, которая отслеживает только ссылки. Это дает вам меньший список для поиска.

0 голосов
/ 25 февраля 2010

Ответ на ваш реальный вопрос - нет, в C ++ нет механизма для определения количества активных ссылок. Тем не менее, хотя C ++ не является сборщиком мусора, если вам интересно, вы можете попробовать один из классов gc_classes. Вот сообщение о переполнении стека, в котором перечислены некоторые из них: Библиотеки сборки мусора в C ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...